I think this is related to TObjectPtr. If you log PlayerArray from C++, it holds pointers to valid PlayerState(s) as expected. If you log PlayerArray from blueprint, its pointers are reported as invalid.
In GameStateBase, PlayerArray is exposed as:
UPROPERTY(Transient, BlueprintReadOnly, Category=GameState)
TArray<TObjectPtr<APlayerState>> PlayerArray;
If you make a helper function that returns TArray<APlayerState*>, it works in blueprints. Ex:
UFUNCTION(BlueprintPure)
TArray<APlayerState*> GetPlayerArray() const;
TArray<APlayerState*> AGame_GameState::GetPlayerArray() const
{
return PlayerArray;
}