En general ORDER BY en una subconsulta no tiene sentido. (Solo funciona cuando se combina con FETCH FIRST/LIMIT/TOP, etc.)
La solución es utilizar una subconsulta correlacionada para encontrar el pez más pesado para el nombre de usuario, la ubicación y la combinación de especies de la fila actual de la "consulta principal". Si hay empate, se devolverán ambas filas.
SELECT *
FROM entries e1
WHERE username = :user
AND CAST(weight AS DECIMAL(9,3)) = (select max(CAST(weight AS DECIMAL(9,3)))
from entries e2
where e1.username = e2.username
and e1.location = e2.location
and e1.species = e2.species)
Tenga en cuenta que char para el peso sigue siendo una mala elección, debido a que debe lanzar ambos lados al comparar valores. ¡Vuelve al decimal en tu tabla!