Man muss unterscheiden zwischen dem `\par` Token, das sind sozusagen die Buchstaben "\ p a r" und die Bedeutung/Wirkung von `\par`: das ist, was passiert, wenn `\par` irgendwo eingefügt wird.
Das \par-Token wird von TeX eingefügt, wenn es auf eine Leerzeile stößt. Das \par-Token ist auch das, was den Fehler "Runaway argument" erzeugt, wenn ein Argument unerlaubterweise eine Leerzeile enthält (weil Leerzeile ja das Token einfügen). Den Fehler gibt es auch, wenn `\par` umdefiniert wurde und gar keinen Absatzumbruch macht: Es kommt nur darauf an, ob das Token "\ p a r" da ist oder nicht.
`\endgraf` und `\@@par` sind Befehle, die die "normale" Wirkung von `\par` enthalten. Die Befehle sind abgesehen vom Namen identisch.
`\@@par` gibt es für Paketautoren. Es könnte ja ein User oder ein Paket `\par` umdefinieren (tatsächlich wird `\par` immer mal wieder, auch im Kernel, umdefiniert), man aber die "normale" Wirkung von `\par` haben will.
`\endgraf` ist für normale Nutzer. Der übliche Verwendungsfall ist, dass man damit einen Absatzumbruch in ein Argument schmuggeln kann, wo er eigentlich nicht erlaubt ist (in "kurzen" Befehlen). Das braucht man nicht oft, aber es kommt schon mal vor. Historisch gesehen kommt `\endgraf` aus plaintex, wo es (auch) für interne Zwecke gedacht war. Aber angesichts dessen, dass LaTeX (und noch mehr LaTeX3) versucht, interne und Benutzerbefehle voneinander zu trennen, sollte man es in Paketen nicht benutzen. Und wer es in Dokumenten benutzt, sollte zumindest in etwa verstanden haben, was es von `\par` unterscheidet.
Der Befehl (und `\@@par`) funktioniert in diesem Fall, "kurzen" Befehlen, weil ja nicht das `\par`-Token eingefügt wird.
\documentclass{article}
\begin{document}
\newcommand*\test[1]{#1} % Wegen * "kurzer Befehl"
%\test{a\par b} %Fehler
\test{a\endgraf b} %Funktioniert
{\def\par{BLUB}
xx\par yy %\par ist normaler Text
%\test{c\par b} %trotzdem Fehler
}
\end{document}