Я не уверен, как вы определяете "последний" - updated_at
? created_at
? или id
?
В любом случае, один подход является коррелированным подзапросом:
select m.*
from messages m
where 1 in (m.receiver_id, m.sender_id) and
m.updated_at = (select max(m2.updated_at)
from messages m2
where (m2.receiver_id, m2.sender_id) in ((m.receiver_id, m.sender_id), (m.sender_id, m.receiver_id))
);