Beside that you are quering for "known" PK & RK, you are providing a lot of them with OR. Having in mind that the chance different partitions to be spread across different physical servers is pretty high, I am not suprised from the results.
Also according to the Storage SLA, a table operation:
Must complete processing or return a continuation within 10 seconds
While an operation on a single entity (that is single pair PK & RK):
Must complete processing within 2 seconds
So 5 seconds is something average and within the SLA. Even you speed up your query somehow, it will not be relible, in terms that the SLA for your query is "within 10 seconds". So all and any efforts you put in optimizing your query may be wasted since this is a variable time depending on lots of factors. And what you achieve today for 3 seconds result, may produce 8 seconds tomorrow and still within the SLA.
I would not go and dig deeper in something that is within SLA.
UPDATE 1
There are number of other ways to minize page load time. You can start thinking Asynchronously! Blow super clean data-empty HTML to the client and load all your data on demand via ajax after page load.
Also think about caching. You can cache (almost) any type of data that is to be presented to the user. With the trade-off "data accuracy" vs "speed loading". So you can cache, or even pre-cache some data that is to be loaded. I think this would be a choice for your scenario, since you know the PK & RK you are looking for - cache that entries and serve them from the cache instead of going to the Table on every request. You can set either absolute expiration or sliding expiration depending on how likely is your data to be changed.
UPDATE 2
As Gaurav mentioned - you can try parallel quering the tables, and put the results into the cache. However the parralelism degree depends on the number of cores you are operating on. So there is no point in doing parralel queries if you are on single core. Still, consider caching and client data binding!