In the spirit of *Mathematica* 10 I would have written it:

    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.