Firstly, VoiceProcessingIO is (as of me writing this) only echo suppression, not echo cancellation. It essentially just turns off the input if the output is too loud. This means that e.g. in a VOIP call, the far end won't be able to hear you while they are talking. Full echo cancellation would keep the input turned on, but attempt to subtract the echoes of the output.
I would suggest only using one unit, and handle the "shutdown speaker" case yourself programmatically. Your output callback might look like this:
OSStatus output_callback(
void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inInputBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
{
my_context_t *context = inRefCon;
audio_sample_t *dst = (audio_sample_t *)ioData->mBuffers[0].mData;
if (context->muted) {
memset(dst, 0, inNumberFrames * sizeof(audio_sample_t));
} else {
get_output_samples(context, dst, inNumberFrames);
}
return noErr;
}
Giving silence to echo suppression should not affect it adversely.