Your conclusion is correct. This is however not an issue when actually running the game, as the server starts completely before the client joins (as demonstrated when running 2 clients).
One way to do it is something along these lines:
local Players = game:GetService("Players")
function playerJoined(player: Player)
for _, player in pairs(Players:GetPlayers()) do -- Make sure all already connected players are run
Players.PlayerAdded:Connect(playerJoined) -- Make sure all subsequent players are run