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.