First off, that game screen looks amazing! I'm not sure it's the kind of game I'd go for, but it definitely has a lot of visual appeal.
As for the data retrieval process, here's a rough idea: Use two queries.
First, this piggybacks on the table-splitting idea proposed by @granite rose , so each move in the combat log would have to be its own document in a separate table.
The first query retrieves the entire collection of moves for a given game when the game loads (or perhaps use pagination to only get the most recent X moves, only loading moves older than that if the user requests). If it's the start of a game, it will be an empty array; otherwise an array of all moves up to the present time. Again, this query only runs once when the game first loads, and it stores the collected documents in a state variable, which is used to render the on-screen list.
The second query only retrieves the most recent move in the game using an index targeting the game ID, with the query ending in .order("desc").take(1). As each new record comes in via this query, it's appended to the full array in state.
This means that the only potentially-heavy query is the first one, but only if a game is in-progress and has lots of moves.
Would that work for this use case?