It turns out that zsh (and most other shells) have a job table with a maximum size. This table keeps track of the background processes, and when it fills up, you can't launch any more background processes.
My workaround was to change my script to launch daemon processes rather than a bunch of background processes.
e.g.
launch.sh:
#!/usr/bin/env zsh
for i in {1..$1} ; do
./dosleep.sh
done
dosleep.sh:
#!/usr/bin/env zsh
nohup sleep 300 &
Also, as @Iain has mentioned, Solaris has a limit on the number of processes a user can launch (ulimit -u). In Solaris 11, to increase this limit edit /etc/project and increase project.max-processes.