Потому что итоговый порядок дочерних элементов .wrap выглядит так:
1) :before
2) img
3) :after
следовательно автоматический присвоенный z-index у img будет большим, чем у :before и изображение расположится на слой выше (между :before и :after, в соответствии с порядком вложенности). Это можно регулировать только фактическим назначением z-index'ов внутри родителя (как вы и закомментировали в примере)