Exactly for that reason there are server-side caches.
Just set up a second level cache (ehcache, etc) and that should solve your scaling issue.
If you use Spring as a backend technology it's a couple of configuration lines to add second level cache for
Apart from caching there is the question if it really makes sense to transmit 10.000 records to the client. Mostly your users will just search in this huge list.
The advantage of transmitting everything at once is that you can search exclusively on the client and you won't need any request to the server. However serializiation and de-serialization of 10.000 records will take some time and it will also increase memory consumption on your browser.
You can also go a hybrid approach. Transfer around 2.000 rows using a AsyncDataProvider and once your search criteria is that specific that you have all the records at the client side you can do client side filtering (but programming-wise that's a little bit more involved)