How does an end device know which frequency a downlink will be on?

Looking at RP002-1.0.4, page 55, section 2.8.7, this defines the RX1 Channel Number:

o RX1 Channel Number = Transmit Channel Number modulo NbChannel, where NbChannel is the number of active receive channels.

So yes, this is fixed and known.
(A bit interesting: there are 8 downlink channels - would there be situations where there is a different number of active channels than 8 being active? I don’t know. )

Yes, which is why for instance on EU868, TTN prefers to use SF9 as that allows a roughly 8x throughput compared to using the default SF12.