The way that miners work now is that they will build an empty block upon receiving a new block, before consolidating the transactions together.
Not all pools do that, some of them publicly disclose that they don't and they prove that by on-chain data, others, never talked about but still never produced an empty block despite solving a huge portion of the blocks, furthermore, until you do download the previous block and remove the included transaction from your mempool you have no way of knowing which transactions are to be removed, so it's not like you can prepare a set of transactions before you receive a block and then just use those transactions, in fact, that might even be more time and resources consuming.
Imagine an available set of transactions as follows:
A,B,C,D,E,F,G,H
now before you find a block you run whatever algo that picked A,B,C for you, so now you prepare that set of transactions and wait till you hit a block, if it's you who find a block -- all great you just add that set, if it's someone else, you would need to re-do the set, now imagine you get a new block notification and start mining a block, the block you received has B in it, so now you would have to do two operations
1- remove B from the set
2- find a replacement for B that matches A and C best
other miners who don't have that set ready would likely reach a new set of "best" combination before you do, because you added extra steps to the process, besides, new transactions keep coming in every second so you are always going to be rotating transactions, so preparing anything before hand is unlikely going to work, and again, given that most bitcoin transactions have the same size, a cutting edge method to chose transactions isn't really needed, maybe at some point in the future as you mentioned.