No hay forma de hacer esto actualmente usando una operación de actualización regular por las razones que anotaste.
La única solución que puede usar en este momento es agregar versiones a su documento y usar el bloqueo optimista leyendo el documento, encontrando los elementos apropiados para modificar en su aplicación, cambiando sus valores y luego usando una update
eso incluye la versión en el documento leído (de modo que si otro hilo actualizó el documento entre su consulta y su actualización, no sobrescribiría los cambios sino que tendría que volver a cargar el documento y volver a intentarlo).
La estrategia de creación de versiones no tendría que basarse en todo el documento, puede crear versiones de los elementos de matriz de primer nivel y luego podría actualizar solo la sub-matriz que le preocupa (a través de una actualización con $set).