Using ! break works in many shells (all but the pdksh based ones and the sh of FreeBSD (by design) in my tests):
$ zsh -c 'for i in x; do ! break; echo "$i"; done'; echo "$?"
1
$ bash -c 'for i in x; do ! break; echo "$i"; done'; echo "$?"
1
$ ksh88 -c 'for i in x; do ! break; echo "$i"; done'; echo "$?"
1
$ ksh93 -c 'for i in x; do ! break; echo "$i"; done'; echo "$?"
1
$ dash -c 'for i in x; do ! break; echo "$i"; done'; echo "$?"
1
$ yash -c 'for i in x; do ! break; echo "$i"; done'; echo "$?"
1
$ bosh -c 'for i in x; do ! break; echo "$i"; done'; echo "$?"
1
$ pdksh -c 'for i in x; do ! break; echo "$i"; done'; echo "$?"
0
$ mksh -c 'for i in x; do ! break; echo "$i"; done'; echo "$?"
0
$ posh -c 'for i in x; do ! break; echo "$i"; done'; echo "$?"
0
Note that it doesn't trigger errexit in any of them.
It was discussed on the austin-group (the body behind POSIX) mailing list last year. The discussion (which involved the maintainers of bosh, FreeBSD sh and NetBSD sh) died out before a consensus was reached, but the prevalent view seemed to be that POSIX required that behaviour as ! is documented as negating the exit status of commands and break is a special builtin command that exits with 0 exit status.
But if you apply the same reasoning to return for instance, you'll see that fewer shells comply.
In zsh, you can use return in an anonymous function instead of break:
$ () for i in x y; do echo $i; return 1; done
x
$ echo $?
1