Vous n'avez pas besoin de la notation complète car l'espace réservé s'est déjà déplacé vers cette position dans le tableau.
db.junk.update(
{ "commandes.voyagesSouscrits.idVoyage": "123" },
{$pull: { "commandes.$.voyagesSouscrits": { idVoyage: "123" } }}
)
Cette partie :
idVoyage: { <query> }
n'est nécessaire que parce que l'opérateur positionnel dans "commandes.$.voyagesSouscrits " ne peut correspondre qu'au premier position du tableau trouvée dans la requête.
http://docs.mongodb.org/manual/reference/operator/projection/positional/
J'espère que cela clarifie.