Общие советы:
Во первых, почитайте как работает DISTINCT - он тут совершенно не при чем.
Во вторых, категорически не рекомендую использовать запрос GROUP BY с указанием в select полей которые не участвуют в группировке / не обработаны агрегирующими функциями. Строго говоря содержимое таких полей может быть достаточно произвольным + на правильно сконфигурированном sql будет ошибка синтаксиса.
Конкретные советы:
Либо получать вложенным запросом типа
select tmp.*, Aincrad\Models\Messages.message
FROM (
select author, recipient, max(id) as maxid
from Aincrad\Models\Messages msg
) tmp
join Aincrad\Models\Messages on Aincrad\Models\Messages.id = tmp.maxid
что будет весьма медленно, либо создать еще одну таблицу в которой явно хранить именно последнее сообщение диалога.