Geralmente, as diferenças entre executar um script manualmente e executá-lo via systemd são diferenças devidas no ambiente. Antes da chamada xdg-open , adicione o comando env em sua própria linha, que despeja o ambiente.
Agora, execute o teste manualmente e via systemd . Procure outras variáveis além de DISPLAY que possam estar causando a diferença. Ao continuar adicionando variáveis de ambiente no script systemd , você poderá encontrar as que o systemd precisa para fazer isso funcionar.
Seu código bash no seu teste parece bem, mas aqui está uma revisão que é um pouco mais idiomática se você estiver interessado. bash naturalmente divide no espaço e URLs não contêm espaço, portanto, esse código alternativo funciona. Eu também substituí o do/done por chaves:
websites="
http://unix.stackexchange.com/
http://stackoverflow.com/"
for i in $websites; {
# works with /usr/bin/firefox
/usr/bin/xdg-open "$i"
}