Solo puedes usar el $
operador posicional para arreglos de un solo nivel. En su caso, tiene una matriz anidada (heros
es una matriz, y dentro de eso cada héroe tiene un spells
matriz).
Si conoce los índices de las matrices, puede usar índices explícitos al realizar una actualización, como:
> db.test.update({"heros.nickname":"test", "heros.spells.spell_id":1}, {$set:{"heros.0.spells.1.level":3}});