Apparently, this was confusing, it's not a subshell specific issue, but it does not happen when called in the opposite order, i.e. first in subshell then directly.
Issue is solved by declaring local OPTIND
in the function.
Closest related question here was Using getopts inside a Bash function.