Los plists, o listas de propiedades, no son más que un formato de archivo para almacenar objetos serializados, por ejemplo, configuraciones o similares. El formato de archivo especifica cómo se almacenan las cadenas, pero no especifica nada acerca de los detalles de nivel superior - como la forma en que los nombres de archivo se almacenan, analizan o tratan de otra manera.
Esto significa que no es posible responder a su pregunta en general para los plists.
La interpretación de $HOME, ~ y las variables de entorno en general en los plists son, por tanto, específicas de la aplicación. Para algunos programas, podría funcionar - para otros no. Depende enteramente de cómo ese programa fue hecho.
ACTUALIZACIÓN: Ha cambiado su pregunta para que sea sobre LaunchDaemons específicamente, y no sobre plists en general.
Para /Library/LaunchDaemons/startup.plist
no es posible referirse directamente a las variables de entorno que mencionas. No son analizadas y reemplazadas con valores por launchd. Además, probablemente no habría funcionado como pensabas aunque lo fueran, porque los LaunchDaemons son ejecutados por Root si no se especifica nada más.
Lo que puede hacer es remitir un programa en el startup.plist
que cuando se ejecuta puede acceder al entorno y hacer la sustitución de variables por ti. Por ejemplo, así:
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
<string>-c</string>
<string>exec $HOME/startup.sh</string>
</array>