Trying alternative methods of searching or indexing to improve the search performance would be the first thing to try in such a situation. But, since that doesn't directly answer the question, and it's been months with no complete answer, I'm going to do my best to answer this myself (making it community wiki since I'm sure this answer can still be improved).
We require the results of a query to be presented to the user over a span of multiple web pages and that the entire result set is consistent across pages. As the original question implied and the edited question confirms, we know that the results of the initial search must be cached to ensure this consistency (freshness is less important than consistency). There are three main places in a web application where the results could be cached.
The first option is to cache the results in server memory. In this case, the query is executed and the identifiers for all of the results is saved usually in a user-specific memory area like an ASP.NET's HttpSessionState or Java's HttpSession{1}. The subset of identifiers for the required page of data is then pulled from this result set and used to load the actual data for return to the user's web browser. As each new pages are requested, the same set of identifiers are used to pull the data for those additional pages.
The next option is to cache the results in the database or other persistent storage. The resulting identifiers from executing the query are written back to the database into a temporary holding table that can be re-queried for each requested page to determine the identifiers of the entities that should be returned to the user's browser, followed by loads of the actual data.
The final option would be to package up the full list of search result identifiers and store them on the client. When requesting additional pages, the client could send the entire list back to the server for processing to determine which result records to load and display. With a slightly more heavy weight client (e.g. javascript, flash, etc.), the client itself could determine which result records are needed from their identifiers, request those from the server and update the display appropriately without needing to send the full list back to the server.
The tradeoffs here are mostly intuitive. Storing in memory requires enough memory to store all active user's search results. There could be some challenges with multiple-concurrent searches by the same user (e.g. two browser windows open), but that could be resolved with a unique search identifier as a key to the results within memory (rather than keying just on the user identifier or using a fixed key in the user-specific session data store). While probably the easiest to implement, this could be quickly problematic if there is no easy way to identify when a user is no longer active and their results can be removed from memory, or if the number of results the number of users could combine to exceed the available server memory.
Storing the results in the database adds some extra overhead in order to persist the results and re-query for the right identifiers, but that should be minimal. Some sort of cleanup job would be required to purge outdated search results when users are no longer active and their results are no longer required.
Storing the results on the client eliminates much of the application infrastructure overhead inherent with the other options (memory and storage), but instead requires more bandwidth which may impact page load times to an unacceptable level (especially on the initial load of all the identifiers). The server may still need to perform some additional work to ensure that the data requested by the client is valid and not a rogue client requesting arbitrary data it shouldn't have access to (this could likely be accomplished with encryption of the keys or cryptographically strong hashes to ensure data remains unmodified by the client)
{1} User sessions usually can be configured to be stored in a database instead of in server memory. The first option is really dealing only with situations where the server's memory is used to store the results. Otherwise, you're looking at the second option where the user's session is a more friendly layer on top of storing the data in the database (i.e. the second option.