So the Play() was causing SwitchToClip() not to switch the clips, without it my original code from the OP works. Still no luck with substreams though, because to use SwitchToClip() I need to get the AudioStreamPlaybackInteractive, which you get with AudioPlayer.GetStreamPlayback(), and again, the stream is not (directly) inside an AudioPlayer so I can't use that...
I can use AudioStream.InstantiatePlayback() which returns a playback from the stream, but from the description I can't tell if it uses the Playback, or creates a new one that I'm supposed to assign to something?
I'm guessing the latter, because this doesn't work:
AudioStreamPlayer audioPlayer = (AudioStreamPlayer)GetNode("AudioPlayer");
AudioStreamPlaybackInteractive audioPlayback = (AudioStreamPlaybackInteractive)audioPlayer.GetStreamPlayback();
AudioStreamInteractive audioPlayerStream = (AudioStreamInteractive)audioPlayer.Stream;
audioPlayback.SwitchToClip(1); // This works
AudioStreamSynchronized substream1 = (AudioStreamSynchronized)audioPlayerStream.GetClipStream(1);
AudioStreamInteractive substream2 = (AudioStreamInteractive)substream1.GetSyncStream(0);
AudioStreamPlaybackInteractive substream2Playback = (AudioStreamPlaybackInteractive)substream2.InstantiatePlayback();
substream2Playback.SwitchToClip(1); // This does not work