This code looks all good to me, you must be right that by the time you change their class, the game has already decided where they will respawn. To get around this you can add a functionOnDeath(A : agent)<suspends>: void = Sleep(1.0)
You might want longer or shorter sleep than 1.0 though, test it out.
Call this in OnEliminated like spawn{OnDeath(Eliminated)}
and it will start your new async function separately, so after the Sleep(1.0) you can Respawn the character, and they should go to the correct spawner. I’m not sure if this will call OnEliminated again, if so only call OnDeath if there is an eliminator.
Also, here is a forum post where they just ended up teleporting players to where they need to be after spawning in. https://forums.unrealengine.com/t/agent-respawn-works-in-uefn-session-but-not-out-in-published-fortnite/833855