I think I figured out the method for selecting the channel. It's not random. It uses the lowest channel number as the first priority.
So if I have a program timer that matches on both 25-0 (SAT) and 25-1 (OTA), it'll be recorded on 25-0.
The other timer I have is actually an OTA subchannel (30-2) that is mapped to 32 (SAT). Since 30-2 is the lower numbered channel, it selects the OTA channel as the first priority.
Since most OTA/SAT equivalents are the same number with a -0 and -1, it will almost always pick the -0 (SAT) channel.
The only workaround is to check the schedule periodically and manually skip the -0 timer event. A pain, but no other way I see.