È possibile utilizzare la richiamata per creare query di join più complicate.
->leftJoin(TBL_CAT, function($query){
$query->on(TBL_CAT.'id', '=', 'p.cat_id')->where("**", "**", "**");
})
Ecco il link su laravel doc - https://laravel.com/docs/5.4/queries# si unisce Sezione "Clausole di partecipazione avanzate".
UPD::Come menzionato nel commento, non è una buona idea avere una stringa per tali tipi di dati. Perché la ricerca per uguaglianza dovrebbe essere molto più semplice del controllo delle stringhe. Anche se la tua quantità di dati non dovrebbe avere grandi differenze, non sai mai cosa accadrà con la tua app in futuro.
Ma se vuoi ancora farlo, penso che puoi provare in questo modo
->leftJoin(TBL_CAT, function($query){
$query->where(DB::raw("FIND_IN_SET(".TBL_CAT.".id, p.cat_id)"), "<>", "0");
})
Unisciti che verificherà l'esistenza dell'id in cat_id.