I guess [the off-chain code] is in the blockchain too[?]
No. Actually. They mean it when they call it "off-chain" :).
Background:
Generally speaking, you want to minimize the amount of code you put on-chain because that code is expensive. For Plutus smart contracts, the role of on-chain code is simply to look at a transaction and say "yes" or "no".
There are two uses for the off-chain code:
- Compile and submit the on-chain scripts
- Create transactions that will be validated by the on-chain scripts
But as I mention in this other question's answer, there is nothing keeping someone from writing their own off-chain code to interact with the on-chain script. This is important for a smart-contract writer to understand when thinking about the security of the on-chain validation.
Answer:
Where is stored off-chain code?
There is nothing binding the on-chain code to a singular off-chain code. So there is no correct answer.
How does the user wallet get it?
From what I understand, there will be options. It could be stored in a repo by the SC writer where you could download it, or perhaps hosted on a website where your wallet can access it (similar to how Metamask works on Uniswap or other Ethereum sites), or you could write it yourself in an attempt to exploit the contract.
As a SC creator, it will be your responsibility to make your off-chain code available to consumers so they can interact with your contract in your intended way.