This is a limitation of find. The POSIX standard specifies that the return status of find is 0 unless an error occurred while traversing the directories; the return status of executed commands doesn't enter into it.
You can make commands write their status to a file or to a descriptor:
find_status_file=$(mktemp findstatus)
: >"$find_status_file"
find … -exec sh -c 'trap "echo \$?" EXIT; invalid_command "$0"' {} \;
if [ -s "$find_status_file" ]; then
echo 1>&2 "An error occurred"
fi
rm -f "$find_status_file"
Another method, as you discovered, is to use xargs. The xargs commands always processes all files, but returns the status 1 if any of the commands returns a nonzero status.
find … -print0 | xargs -0 -n1 invalid_command
Yet another method is to eschew find and use recursive globbing in the shell instead: **/ means any depth of subdirectories. This requires version 4 or above of bash. Use set -e to halt the script on the first command returning a nonzero status.
shopt -s globstar
set -e
for x in **/*.xml; do invalid_command "$x"; done