What is the proper way to handle waiting for a reference to be valid?

For checking on the server, look into APlayerController::OnPossessed(). That fires on the server when the pawn is possessed by the controller.

There’s various points in AGameMode, APlayerController, and AGameState that I know of where you could perform checks for the pawn when the player connects.