I think you shouldn't consider passing the RequestID through the Querystring as a "worse" solution or as a less "proffesional" one. After all, Sharepoint does it out of the box.
Yes, there are other possibilities. For example, you could put the ID in a session variable, but session is disabled on Sharepoint by default. And if you have multiple Web Front Ends, you have to make sure somehow, that every subsequent request from the same user will read the same session (either using sticky sessions, either distributed session).
You could also put the variable in the server cache, but if using the default ASP.NET cache, you have the same restraints as above regarding multiple WFE.
You could use GUIDs as IDs in the QueryString, to prevent users from trying out all sorts of IDs, because it's much harder to guess valid GUIDs than guessing valid integers. But why are you affraid that users might change that ID from the QueryString? Authorization reasons? It shouldn't be "security by obscurity" which prevents them accessing unauthorized data. It should be real security trimming.
Could you tell me please more about the reason why you would like to avoid passing the ID in the QueryString?