Você pode usar o retorno de chamada para criar uma consulta de junção mais complicada.
->leftJoin(TBL_CAT, function($query){
$query->on(TBL_CAT.'id', '=', 'p.cat_id')->where("**", "**", "**");
})
Aqui está o link do documento laravel - https://laravel.com/docs/5.4/queries# junta seção "Cláusulas de junção avançadas".
UPD::Como mencionado no comentário, não é uma boa ideia ter string para esses tipos de dados. A pesquisa de causa por igualdade deve ser muito mais simples do que a verificação de string. Mesmo que sua quantidade de dados não tenha grande diferença, você nunca sabe o que acontecerá com seu aplicativo no futuro.
Mas se você ainda quer fazer isso eu acho que você pode tentar assim
->leftJoin(TBL_CAT, function($query){
$query->where(DB::raw("FIND_IN_SET(".TBL_CAT.".id, p.cat_id)"), "<>", "0");
})
Join que verificará a existência de id em cat_id.