GPG's (or OpenPGP's) public-key file encryption uses multiple steps:
- Generate a random session key
- encrypt the file using this random session key
- encrypt the random session key using the public key of the receiver (or using multiple keys in parallel, if the file is meant to be decrypted by multiple receivers).
- store the encrypted file together with the encrypted session key.
To decrypt it, the receiver (or attacker) needs the private key corresponding to (one of) the used public key(s).
Now, Alice should have protected her private keys with a passphrase - this way, Bob would get not the private key itself, only an encrypted version of it. If so, Bob's only way for decrypting the key (and thus the file) would be to guess the encryption passphrase (which can be possible if the passphrase is not that long/complicated).
If Alice didn't protect her private keys, Bob would get the private key, and could directly use it to decrypt the session key, and thus decrypt the file.