Помните, что .has () возвращает jQuery , а не логическое значение!
.has (селектор) Возвращает: jQuery
Описание: Сократить набор соответствующих элементов до тех, чей потомок соответствует элементу селектора или DOM.
Выполнение if(!$(this).has('p'))
всегда верно, поскольку jQuery всегда возвращает набор, даже если он пустой!
.has()
в основном фильтрует набор, к которому он обращен, так что выпросто нужно сделать:
$('.test').has('p').addClass('red');