Puede usar la devolución de llamada para crear una consulta de unión más complicada.
->leftJoin(TBL_CAT, function($query){
$query->on(TBL_CAT.'id', '=', 'p.cat_id')->where("**", "**", "**");
})
Aquí hay un enlace en laravel doc - https://laravel.com/docs/5.4/queries# se une Sección "Cláusulas de unión avanzadas".
UPD::Como se menciona en el comentario, no es una buena idea tener una cadena para este tipo de datos. La búsqueda de causas por igualdad debería ser mucho más simple que la verificación de cadenas. Incluso si su cantidad de datos no debería tener una gran diferencia, nunca sabe qué sucederá con su aplicación en el futuro.
Pero si todavía quieres hacer eso, creo que puedes intentarlo así
->leftJoin(TBL_CAT, function($query){
$query->where(DB::raw("FIND_IN_SET(".TBL_CAT.".id, p.cat_id)"), "<>", "0");
})
Únete que verificará la existencia de id en cat_id.