Are all of the outputs on the same device and you're using SPEAKER flags to access them? If so, are you feeding them all through a master 10 channel mixer? If you are, you can lock that master mixer (rather than any sub-mixers) for synchronized changes to the mix, and it should all remain in sync.
If the outputs are entirely separate streams, then any changes won't necessarily be perfectly in sync across them, even with locking. If you want to synchronize changes in separate streams, "mixtime" BASS_SYNC_POS syncs could perhaps be used to get them in sync. For example, you could try something like this...
BASS_ChannelLock(mixer1, TRUE); // lock the mixers to prevent further processing
BASS_ChannelLock(mixer2, TRUE);
QWORD pos1=BASS_ChannelGetPosition(mixer1, BASS_POS_BYTE|BASS_POS_DECODE); // get the current processing positions
QWORD pos2=BASS_ChannelGetPosition(mixer2, BASS_POS_BYTE|BASS_POS_DECODE);
if (pos1==pos2) { // the mixers are at the same position
// apply changes to mixer1 and mixer2 here
} else if (pos1<pos2) { // mixer2 is ahead of mixer1
// apply changes to mixer2 here
BASS_ChannelSetSync(mixer1, BASS_SYNC_POS|BASS_SYNC_MIXTIME, pos2, ...); // set a sync to apply the changes on mixer1
} else { // mixer1 is ahead of mixer2
// apply changes to mixer1 here
BASS_ChannelSetSync(mixer2, BASS_SYNC_POS|BASS_SYNC_MIXTIME, pos1, ...); // set a sync to apply the changes on mixer2
}
BASS_ChannelLock(mixer1, FALSE); // unlock the mixers
BASS_ChannelLock(mixer2, FALSE);
If the change that you want to apply is adding a source, then BASS_Mixer_StreamAddChannelEx could be used to do that instead of a sync, ie. with the "start" parameter set accordingly.
Note this won't necessarily keep things in sync if the devices that the mixers are using are going at slightly different rates; things get even more tricky then!