In generale ORDER BY in una sottoquery non ha senso. (Lo fa solo se combinato con FETCH FIRST/LIMIT/TOP ecc.)
La soluzione consiste nell'utilizzare una sottoquery correlata per trovare il pesce più pesante per la combinazione di nome utente, posizione e specie della riga corrente della "query principale". In caso di pareggio, verranno restituite entrambe le righe.
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)
Nota che il carattere per il peso è ancora una cattiva scelta, perché devi lanciare entrambi i lati quando confronti i valori. Torna al decimale nella tua tabella!