Something like that can work. As suggested, I’d use a different template. Also the way you collect will result in quadratic behavior as nb_setarg/3 copies the argument that gets bigger and bigger. That is nasty to avoid. It is doable though. I once write a findall/3 alternative using this technique call findfew/3 as it is faster if the goal only a few solutions, but gets slower if there are many. Here is the code:
:- meta_predicate
find_few(?, 0, -).
find_few(T, G, L) :-
L0 = [dummy|_],
Result = list(L0),
( call(G),
duplicate_term(T, T2),
NewLastCell = [T2|_],
arg(1, Result, LastCell),
nb_linkarg(2, LastCell, NewLastCell),
nb_linkarg(1, Result, NewLastCell),
fail
; arg(1, Result, [_]),
L0 = [_|L]
).