Position and Extract allow a more direct approach than SparseArray while keeping the logic similar. Shorter code plus a 2-3x speedup on the 5D case makes a good trade I think.
ArrayCrop[a_, b_] :=
Extract[a,
Span @@@ MinMax /@
Transpose@Position[a, Except@b, {-1}, Heads -> False]]
ArrayCrop[a_] := ArrayCrop[a, 0]