Two reasons:
1: By storing GameSettings variable inside GameInstace and use “Get Game Settings”, I am guaranteed that it will be the same variable. It allows for easy access the same GameSettings variable from almost any blueprint.
2: The GameSettings blueprint is of type saveclass, allowing me to save and load all its variables. It has the downside that it can’t use “Execute Console Command” node, and it is required to apply some settings. The GameSettings class forwards all console command strings to GameInstance instead, that can support “Execute Console Command”
Edit: It is set up so it all goes through an interface “GameSettingsInterface”. So you can make use of your own game instance, as long as you add the interface and the same nodes as the provided GameInstanceWithSettings blueprint. More help can be found in Manual.