In the spirit of Mathematica 10 I would have written it like this:
Composition[
DeleteCases[{{0} ..}],
Map[Transpose],
SplitBy[#, Unitize@*Total] &,
Transpose
]@mat
{{{0, 0}, {1, 0}, {0, 1}, {0, 0}, {1, 1}, {0, 0}}, {{0}, {1}, {0}, {0}, {1}, {1}}, {{1}, {1}, {0}, {1}, {0}, {1}}}
With rules I would write:
Transpose /@ {Transpose[mat] //. {el__, {0 ..}, rest___} :> Sequence[{el}, {rest}]}
{{{0, 0}, {1, 0}, {0, 1}, {0, 0}, {1, 1}, {0, 0}}, {{0}, {1}, {0}, {0}, {1}, {1}}, {{1}, {1}, {0}, {1}, {0}, {1}}}
The first method assumes numeric matrix elements but the second doesn't.