U kunt alleen de $ . gebruiken positionele operator voor arrays met één niveau. In jouw geval heb je een geneste array (heros is een array, en daarbinnen heeft elke held een spells reeks).
Als u de indexen van de arrays kent, kunt u expliciete indexen gebruiken bij het uitvoeren van een update, zoals:
> db.test.update({"heros.nickname":"test", "heros.spells.spell_id":1}, {$set:{"heros.0.spells.1.level":3}});