Ganache fork allows to rely on an external source to get past chain state. This allows to query necessary data, and only that. Think of it more as a light client.
When the fork is created, it means that it will rely on the RPC for past state (a merkle root) that isn't available, however if some state is available here in ganache it will rely on it. So for example, upon startup it will seed 10 user addresses with 100 Eth each. Moving the funds around only affects the local state obviously. Each new block is just a signed state transition.
A1: It doesn't download all, it only query the parts of the state that are required to execute a tx. If you want to interact with a contract, it will get the contract code.
A2: Since it doesn't download blocks, it does continue to call the RPC whenever some past state is necessary and not available locally. The amount of past state that is stored locally is defined by the forkCacheSize
parameter.
Depending on which RPC you use it may be slow if you keep requesting lots of data. If you keep interacting with the same contracts over and over again, then data is already locally cached and nothing more is queried from the RPC.
As for why on startup ganache can create a new block seeding 100 Eth to 10 addresses, well for dev purposes ganache has a special rule that makes such a block valid.