Game states can be synchronised by sending "deltas"—messages that describe how to get from one game state to the next, rather than sending the whole state. You seem to have figured out that this is possible.
To get you started on the right path of thinking, here's a more concrete (but naïve) way that could be implemented:
In server code, store a boolean
"change flag" for each property that you might want to send to a client. Whenever the property is changed, set the corresponding flag. On update, only send properties which flag is set, then unset all flags again. When the client receives any message, it overwrites the given properties on its own copies of the game objects, but doesn't change any of the properties that weren't mentioned.
This works well if your game world is small and all clients need to get all changes.
It might also be worth looking into event architectures, as they're a very effective and commonly used abstraction for synchronising just this kind of thing.
If your world is large, you might want to look into partitioning it into regions. Clients could then request a full state update when entering a region, but receive deltas about objects in the nearby region only while they remain there.