Ganz genau kann ich dir das auch nicht beantworten, aber es gibt noch mindestens einen weiteren, etwas versteckten Fall:\version "2.19.35"
\relative {
c' d e f
}
\addlyrics {
Al -- le mei -- ne
}
bla = \lyricmode {
Al -- le mei -- ne
}
\relative {
c' d e f
}
\addlyrics \bla\addlyrics geht also automatisch in den \lyricmode, aber um Text in ne Variable zu packen, braucht man den \lyricmode auch nochmal. Ein zusätzliches \lyricmode im ersten Beispiel (\addlyrics \lyricmode { …) wäre wiederum falsch.
Ich nehme mal an, dass an eine Variable nur was syntaktisch vollständiges zugewiesen werden kann, also muss z. B. bei der Zuweisung schon explizit \layout, \with oder \lyricmode stehen. Aber beim Aufruf muss LilyPond anscheinend auch wissen, was sich ungefähr in der Variable befindet, ohne sie auszuwerten. Daher auch an dieser Stelle das zweite Auftreten.
Grundsätzlich muss man sich halt von dem Gedanken verabschieden, dass Variablen wie reine Textersetzung funktionieren (anders als z. B. Dinge, die per #define in C/C++ definiert werden).