Após um e-mail posterior para a lista de discussão dos usuários do zsh, recebi a solução quase ideal para o problema:
if [[ -d "/etc/zsh.d" ]]; then
for f in /etc/zsh.d/*.zsh(N); do
source $f
done
fi
O (N) diz ao zsh para definir a opção NULL_GLOB para esse padrão. Quando nenhuma correspondência é encontrada, o glob se expande para uma string vazia em vez de lançar um erro. Em zsh, um loop for sobre uma expansão vazia não faz nada, que é o comportamento que queremos aqui.