My C# program for rig synchronization is working well. To solve the mute issue I ended up using a .Net package (available from nuget) which provides C# wrappers around the MS CoreAudio API and using that to mute the audio when my program detects (via Omnirig) that my icom IC-7700 is transmitting. It's not perfect in that I get a 100ms or so of my audio before the mute occurs but it has the added advantage of muting everything, including a web sdr if I'm listening to one of those which I sometimes do when running a net under difficult band conditions. When I get the serial cable built to do HW muting I'm sure my S2 issue will be completely resolved.
My program incorporates the omnirig DLLs which are event driven by the IC-7700. Changes in the 7700 (frequency and mode) are translated into TCP commands to sync the s2. This is kind of cool as it provides knob control of the s2, using the knobs on the rig. A separate thread polls the s2 for changes which are relayed to ic-7700 via omnirig. A arbiter thread determines which unit is in control. This gives the best of both worlds. You can use tune both the s2 and the rig by clicking on the waterfall or direct tuning the s2, by clicking on a station in cw skimmer/fldigi, or you can use the knobs and other controls on the transceiver. Either direction everything stays in sync. To work split mode, I simply use the dTx or RIT on the 7700 and the s2 stays put.
The polling thread also gets the S-meter value and displays it on a scrolling "strip chart" display which is very handy for reporting signal reports as you can easily see the peak and average values over time. With this set-up, I do not enable Omnirig SW2 which solves my original problem and also keeps the waterfall stationary when tuning which is a big plus. The only downside is having to poll the s2 (no events in TCP). I found a 200ms polling interval though works well, giving a good compromise between responsiveness on my GUI and the SW2 GUI.
Thanks for your suggestions,