The best I have is manual RHS holding and `Join`, after which an arbitrary head could be Applied:

 Join @@ Cases[expr, x : _Times :> Hold[x], 3]

> Hold[2/2, 8/4, 1/0]

This could be done automatically as follows:

 heldCases[expr_, rule_, args___] :=
 Join @@ Cases[expr,
 Replace[rule,
 {(L_ -> R_) :> (L -> HoldComplete[R]),
 (L_ :> R_) :> (L :> HoldComplete[R]),
 pat_ :> (x : pat :> HoldComplete[x])}],
 args
 ]

I am not really happy with the code however, and I wonder if there is a more elegant or efficient method.