The gamestate is most likely a huge amount of data. And you'd have to pause the game while that person loaded everything up.
The netcode only passes the most basic information necessary, then each player's client runs the game according to these ongoing instruction. So, you only pass information like 'Player X orders Tank Y to attack-move to point Z'. Every consequence of this - the tank moving forward, stopping to engage an anti-tank gun which destroys the tank, destroying the unit and leaving a burning wreck behind - doesn't actually need to be sent over the network. No further communication was necessary after the order was given, as the same consequences happen in each individual players model of the game. The replay file consists of nothing except these commands. This is a huge bandwidth saver and works fine for every purpose but joining people on the fly and keeping old replays viewable. The typical way you can enable hotjoins is to stream the replay data to a connecting player, then stream the ongoing data, and the connecting client runs the game as fast as possible until they catch up with real time. This is possible, but nontrivial to implement - probably not worth it for a game like SD.