With an up-to-date LaTeX \show\( produces
> \(=macro:
->\x@protect \(\protect \( .
l.10 \show\(
which looks very robust.
And indeed a look at source2e, §E.1.2, p. 494 in version 2020-10-01PL4 shows that since 2015/01/01 we have had
\DeclareRobustCommand\({%
\relax\ifmmode\@badmath\else$\fi}%
\DeclareRobustCommand\){%
\relax\ifmmode\ifinner$\else\@badmath\fi\else \@badmath\fi}%

In ltnews 22 from January 2015 we find that all fixes from fixltx2e are now enabled by default in the LaTeX kernel, so in particular the kernel now defines \( and \) as robust commands. In issue 26 from January 2017 of ltnews we find that all changes from fixltx2e that were added to the kernel in LaTeX version 2015-01-01 are guarded by \IncludeInRelease{2015/01/01}, so can be rolled back with latexrelease.
Hence, if you want to test with the old fragile behaviour, you can roll back your LaTeX version with latexrelease to a date before 2015/01/01, e.g.
\RequirePackage[2014/01/01]{latexrelease}
\documentclass{article}
\begin{document}
\tableofcontents
\section{(x)}
\end{document}
latex '\ShowCommand\( \stop'tells you that the command is robust:> \(=robust macro: ...– Phelype Oleinik Mar 08 '21 at 09:32