Here's a more detailed breakdown of what is sort of working and what isn't.
In the first image shown the set up is:
Track 1, Software inst: MIDI port - IAC Bus 1, MIDI Channel 1 in and out, rec enabled.
Track 2, Software inst: MIDI port - IAC Bus 2, MIDI Channel 1 in and out, rec enabled.
Track 3, External MIDI: MIDI port (in and out) IAC Bus 1, MIDI Channel 1 in and out.
Track 4, External MIDI: MIDI port (in and out) IAC Bus 2, MIDI Channel 1 in and out.
It has these program changes:
Track 3: Pos. 1 1 2, ch 1, Val 0; Pos 161 1 2, ch 1, Val 101.
Track 4: Pos 1 1 3, ch 1, Val 1; Pos 161 1 3, ch 1, val 102.
The above seems to work around 9 times out of 10. Around 1 time out of 10 only 1 channel will pick up the program change. I still haven't quite figured out what causes it to do this.
Anyway, I could probably work with it if that was the only issue. Unfortunately it starts to break down if I add another tracks with IAC Bus 3 as the port. In the second image I've added the 3rd track but haven't yet set up IAC Bus 3 in the environment. At this point it still works. I then add IAC Bus 3 and track 6, which is assigned to IAC 3. Now track 3 picks up program changes for track 2 and track 2 does nothing.
I'll keep tinkering and update the thread if I make any further progress.