Sie können nur den $ verwenden Positionsoperator für einstufige Arrays. In Ihrem Fall haben Sie ein verschachteltes Array (heros ist ein Array, und darin hat jeder Held einen spells Array).
Wenn Sie die Indizes der Arrays kennen, können Sie bei einer Aktualisierung explizite Indizes verwenden, wie zum Beispiel:
> db.test.update({"heros.nickname":"test", "heros.spells.spell_id":1}, {$set:{"heros.0.spells.1.level":3}});