Yes, it is very common approach in Windows games to have audio in separate thread. This is to avoid unexpected delays/spikes which might be not game code related, but OS messing with your code.
With separate audio thread you have to approaches for synchronization.
First one is to do mixing in main thread, and just pass fully prepared buffer to audio thread. Only synchronization you need to worry is about fully prepared buffers, not individual audio sources. Disadvantage is probably higher latency, because once buffer is submitted to audio thread, you cannot overwrite it (depending on what actually is available from OS). So you need to prepare large enough buffer to cover full frame of delay.
Second one is to do mixing in audio thread. In this case you need to synchronize actual audio sources and make sure you don't change your data structures in a way where race condition happens. Ideally if you can load all audio sources at startup / level loading, and can guarantee they will be alive all the time, then synchronization becomes trivial. Only tricky thing is to figure out which sources are active, and that probably can be done with some interlocked ops. Advantage of this is that you can get smaller latency because you can mix in smaller chunks - all the mixing happens in background thread, so any delays in main game thread doesn't affect it.