Es más simple de lograr con un GROUP BY, el cual realiza, al menos en MySQL, una "acumulación" de los campos que no se declaran en el GROUP BY. De esa forma, devolverá solamente un registro por cada id_publicación distinto, y sólo la primer imagen de la lista.
Para hacer que muestre la primer imagen de un orden determinado, por ejemplo la última ingresada y no la primera, se debe usar algún campo o campos adicionales en un ORDER BY para lograr que la primera imagen del grupo sea la deseada.
Código:
SELECT
pub.id_publicacion,
o.url_imagen
FROM
publicaciones pub INNER JOIN imagenes o
ON pub.id_publicacion = o.id_publicacion
GROUP BY id_publicacion;
Otro tip: Las igualaciones de tipo
pub.id_publicacion = o.id_publicacion en un JOIN no deben ir en el WHERE sino en el FROM usando la cláusula ON. Esto es así, además de razones de sintaxis, porque eso le permite al MySQL optimizar internamente la consulta; en cambio si lo pones en el WHERE, no es optimizable.