I don't think you can see it directly.
xtrace (set -x) does show nesting level for evals and command substitutions, but not for groups in parenthesis.
Bash runs subshells in child processes, so in principle you could try to run strace or similar to see the fork() (clone() on Linux) and execve() system calls the shell and it's children make, but the output is a bit hard interpret. Also, builtins like that printf there don't show up in execve() calls, and when a Bash process only has one command to run, it skips one level of forks. E.g. bash -c '/bin/false' doesn't fork for the external command, and similarly (/bin/false) only has one fork for the subshell, not two for subshell and external command.
You could also print $BASHPID in various places it compare it to $$. $BASHPID contains the PID of the Bash process actually running at the time while $$ contains the PID of the main Bash process and doesn't update for subshells. Though it doesn't show you the commands that are run, and sprinkling those printouts is a bit messy:
$ echo $$ >&2; { echo "lhs: $BASHPID" >&2; printf foobar; } | { echo "rhs: $BASHPID" >&2; grep oo; }
30163
rhs: 30166
lhs: 30165
foobar
Yes, we can tell from the output that both parts of a pipeline run in subshells, even though that wasn't mentioned in the part you quoted.
Anyway, what runs in subshells is mostly those, the three your quote mentiones, plus pipelines.
Async/background processes are obvious: they run at the same time as the shell, so they can't be in the same process. The parts of a pipeline also have to run concurrently, so at most one can run in the main shell process. (In Bash, the rightmost part will do that if the lastpipe option is set and effective, otherwise they all get their own subshells/processes.)
Parenthesized groups explicitly ask for a subshell, and well, I can't think of an excuse for command substitutions, so I guess we'll just have to accept they also do.
Changes in a subshell don't propagate up to the main shell, so it's also relatively simple to test this. E.g. if you run:
bash -c 's=
s+=direct.
(s+=parens.)
$(s+=comsub.)
s+=pipeleft. | s+=piperight.
s+=async. &
eval s+=eval.
echo $s'
You get the output direct.eval., so those are the parts that didn't run in subshells. The rest did. If you add -O lastpipe before the -c, or shopt -s lastpipe; within the script, you'll also see piperight added to the list.
grep -E "(first|second)"is ONE COMMAND with an ARGUMENT that CONTAINS parentheses (quoted) as DATA, whichgrep -Etreats as an extended-regex operator, and it is run as one process; since it's not a builtin, it doesn't run in any kind of shell, main or sub-. The next sentence of 3.7.3, which you omitted, notes that builtin commands in a pipeline are executed in a subshell -- though that's no longer entirely true, seelastpipein 3.2.3 and 4.3.2.