Tic-Tac-Toe game requiring two players
Well, it's a good idea to minimize dependency on global state.
Doing so enhances testability and reduces dependencies, especially the hidden type.

Still, if you have such pervasively used state as Game, it's a valid thought to make it global instead of passing it around everywhere.
Pass the arguments needed, no more, no less.
It could be. Or not. In any case, it would reduce your flexibility in using your code for example for a tic-tac-toe contest.


Now lets critic your code:


validPos seems to be redundant, being a simple function of board. Or is there some extra magic?
Avoid dynamic allocation where it doesn't help. That means the memory-used is scoped and the block is reasonably small, like those allocations in main.
Anyway, avoid repeating your types to avoid mismatches. It should have been:

Game *game = malloc(sizeof *game);

Parameter names are valuable space for documenting an arguments use.
At least scoreBoard and declareWinner could use a bit more:

void declareWinner(Game *, Player* winner, Player* looser);
void scoreBoard(Player *, Player *, int round);
// documented my guesses what the pertinent arguments mean