Você pode usar os formulários octal e fazer os cálculos manualmente. Com um shell POSIX:
dir_perms=$(printf '%#o' "$((0777 - $(umask)))")
non_dir_perms=$(printf '%#o' "$((dir_perms & 0666))")
find . -type d ! -perms "$dir_perms" -o ! -type d ! -perms "$non_dir_perms"
O formato de saída de umask sozinho não é especificado por POSIX, mas, na prática, será todos os shells, é um número octal com pelo menos um 0 à esquerda.
zsh não trata números com 0s iniciais como octal por padrão. Em zsh , você pode ativar sh emulação em um contexto local para isso ( (){ emulate -L sh; ....} ou (emulate sh; ...) ou apenas set -o octalzeroes ) ou usar:
dir_perms=0$(([##8] 8#777 - 8#$(umask)))
non_dir_perms=0$(([##8] 8#$dir_perms & 8#666))
Com mksh que não trata números com 0s iniciais como octal por padrão, você pode usar set -o posix ou fazer:
dir_perms=$(printf '%#o' "$((8#777 - 8#$(umask)))")
non_dir_perms=$(printf '%#o' "$((8#$dir_perms & 8#666))")