Sounds like your friend's PC is slower than yours. It cannot keep up with how fast your CPU is advancing the game.
As SpeckledFleebeedoo mentioned, pausing the game can help in this situation since it prevents game state advancing allowing the joining client to eventually catch up, no matter how slow it is. However, once caught up the client might not be able to play well due to a lot of frame drops, potentially leading to them being dropped for being unable to keep up if they are too slow.
Another option might be to swap who hosts to the slowest computer. This way everyone should be able to eventually catch up without pausing and also have a good play experience without many dropped frames.
The last option is to slow the game speed down using console commands that disable achievements. This can be used to reduce the simulation speed to what the slowest player can keep up with. Even still it might be advised to pause while the slowest player is joining as it otherwise might take them a very long time to catch up.
Pausing the instant the server saves for someone to join until that person has finished joining will as good as eliminate catch up time entirely as as good as no updates were made since the save was made until they finished loading that save.
The rate the map downloads depends on the connection speed of the server, the client and the network between them. If the result is significantly slower than expected then this might be due to how factorio handles files transfers. Some people have had success altering the network related parameters on the server/host, allowing significantly higher transfer speeds than the defaults.