Taking a second look at the execution plans, I've noticed that the scan on slow read twice the number of pages from disk than the one on fast:
Buffers: shared read=442478 vs. Buffers: shared read=221239
Since I loaded all rows into slow first and then moved 50% of them into fast, this makes sense, I guess.
If I understand it correctly, those pages in slow are now empty, but PostgreSQL keeps them for future use.
So I tried a VACUUM FULL on slow and ran my queries again. That changed the plans:
Buffers: shared read=221239 vs. Buffers: shared read=221239
And execution times are now about equal. The observed effect had nothing to do with table inheritance at all.
So VACUUM FULL can help, when moving big chunks of data between tables with otherwise low write activity.