Потому, что before считается дочерним элементом, а дети не могут быть ниже родителя.
Они берут свой z-index от родителя в приоритете.
https://jsfiddle.net/v5hyn0d1/ еще одна обертка решит проблему, так тень и кнопка будут детьми wrapper'а, поэтому их можно будет перемешивать z-index'ом.