Je pense comme ça :
return $this->createQueryBuilder('r')
->select('SUM(r.value)')
->join('r.question', 'q')
->where('r.userSlp = :userSlp AND q.id <= 65')
->setParameter('userSlp', $userslp)
->getQuery()->getSingleScalarResult();
LIMIT (setFirstResult et setMaxResults) ne peut pas fonctionner étant donné que ça sert à définir quelle partie tu veux récupérer des lignes du résultat et que la tu n'as qu'une ligne en retour.
D'ailleurs si r.question <= 65 fonctionne alors ça devrait suffire :
return $this->createQueryBuilder('r')
->select('SUM(r.value)')
->where('r.userSlp = :userSlp AND r.question <= 65')
->setParameter('userSlp', $userslp)
->getQuery()->getSingleScalarResult();
En fait ce que tu as fait est très bien du coup. ^^
Les jointures ne sont utiles que si tu veux hydrater tout le result set ou si tu as besoin d'utiliser les colonnes des tables jointes dans ton query builder.
La c'est inutile puisque la requête au final c'est :
SELECT SUM(r.value) FROM reponse r WHERE r.user_id = :id AND r.question_id <= 65