How can I identify queries that are producing cache misses in Postgres?
The pg_stat_statements extension does exactly what you want, giving the block hits and misses for each statement.

However, I usually don't find this information all that useful.  Many of the block misses are actually served by the file system cache and not actually read from disk.  PostgreSQL provides no direct way to discern these types of misses.

I think the best thing to do would be to turn on track_io_timing and then look at the time spent servicing those misses, rather than the raw number of misses.