The reason for this is because \droppoints
also inserts a rubber length - \hfill
- to stretch to the right side of the page. The length is shared between the two components, \hfill
and \hrulefill
.
You can either force a new paragraph and then jump back to insert the \droppoints
, or create a new macro (say) \droppointshere
that doesn't insert the \hfill
:

\documentclass{exam}
\makeatletter
\def\droppointshere{%
% \leavevmode\unskip\nobreak\hfill% <----- removed
\rlap{\hskip\rightmargin % Defined by the list environment
\hskip\@rightmargin % Defined by exam.cls
\hskip-\rightpointsmargin
\llap{\padded@point@block}%
}% rlap
\par
}
\makeatother
\begin{document}
\begin{questions}
\question[2]
This is a question to answer here: \hrulefill
\question[2]
This is another question: \hrulefill \droppoints
\question[2]
This is another question: \hrulefill \par
\vspace{\dimexpr-\parskip-\baselineskip}\droppoints
\question[2]
This is a final question: \hrulefill \droppointshere
\end{questions}
\end{document}