Al momento non è possibile eseguire questa operazione utilizzando un'operazione di aggiornamento regolare per i motivi che hai notato.
L'unica soluzione che puoi utilizzare al momento è aggiungere il controllo delle versioni al tuo documento e utilizzare il blocco ottimistico leggendo il documento, trovando gli elementi appropriati da modificare nella tua applicazione, modificandone i valori e quindi utilizzando un update
che include la versione nel documento letto (in modo che se altri thread aggiornassero il documento tra la tua query e il tuo aggiornamento non sovrascriverai le modifiche ma dovresti ricaricare il documento e riprovare.
La strategia di controllo delle versioni non dovrebbe essere basata sull'intero documento, è possibile eseguire la versione degli elementi dell'array di primo livello e quindi aggiornare solo il sottoarray di cui si è interessati (tramite un aggiornamento con $set).