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.