SELECT MAX(message_id) FROM messages GROUP BY GREATEST(to_id, from_id), LEAST(to_id, from_id);
Se você quiser as próprias mensagens, você pode colocar isso em uma subseleção ou transformá-lo em uma visualização e juntá-lo com mensagens.
SELECT MAX(message_id) FROM messages GROUP BY GREATEST(to_id, from_id), LEAST(to_id, from_id);