Con hilos se complica un poco. Debes estar seguro de no recibir y emitir al mismo tiempo.
Pero si el arduino solo contesta a los comandos que recibe en el mismo case se emite el comando y se espera la respuesta.
Otra forma sería emulando la forma de trabajar de un PLC: se mira si hay algo de comunicación externa; se controlan las entradas; se calcula lo que se deba, se escriben las salidas; se escriben las comunicaciones externas.
Uy uy, que catastrofista
Realmente, utilizando GetAsyncKeyState() y 2 mutex (uno para la salida por consola y otro para el Serial), está sincronizado.
O al menos lo estaría si el protocolo PC-Arduino fuera más preciso, vaya. Porque como escriba el PC al Arduino y el Arduino al PC a la vez, el PC se tomará lo del Arduino como respuesta xD