I finally found a solution to automatically increases spacing after ( and before ). For those modified by \left and right it is easy:
\renewcommand\left[1]{\mathopen{}\mathclose\bgroup\ifx#1(\originalleft(\,\else\originalleft#1\fi}
\renewcommand\right[1]{\aftergroup\egroup\ifx#1)\,\originalright)\else\originalright#1\fi}
For ordinary brackets, we need to use a trick to make them active. Applied here we get:
\begingroup\lccode`~=`(\lowercase{\endgroup\def~}{\oldlbrac\,}
\AtBeginDocument{\mathchardef\oldlbrac=\mathcode`(\mathcode`(="8000}
\begingroup\lccode`~=`)\lowercase{\endgroup\def~}{\,\oldrbrac}
\AtBeginDocument{\mathchardef\oldrbrac=\mathcode`)\mathcode`)="8000}
\makeatletter
\def\resetMathstrut@{%
\setbox\z@\hbox{%
\mathchardef\@tempa\mathcode`\[\relax
\def\@tempb##1"##2##3{\the\textfont"##3\char"}%
\expandafter\@tempb\meaning\@tempa \relax
}%
\ht\Mathstrutbox@\ht\z@ \dp\Mathstrutbox@\dp\z@}
\makeatother
Here is complete working example:
\documentclass{article}
\usepackage{amsmath}
\usepackage{mathtools}
\usepackage[T1]{fontenc}
\newlength\bracskip\setlength{\bracskip}{.04em plus .04em minus .02em}
\newcommand\bracspace{\hspace{\bracskip}}
\begingroup\lccode~=(\lowercase{\endgroup\def~}{\oldlbrac\bracspace}
\AtBeginDocument{\mathchardef\oldlbrac=\mathcode(\mathcode(="8000}
\begingroup\lccode~=)\lowercase{\endgroup\def~}{\bracspace\oldrbrac}
\AtBeginDocument{\mathchardef\oldrbrac=\mathcode)\mathcode)="8000}
\let\originalleft\left
\let\originalright\right
\renewcommand\left[1]{\mathopen{}\mathclose\bgroup\ifx#1(\originalleft(,\else\originalleft#1\fi}
\renewcommand\right[1]{\aftergroup\egroup\ifx#1),\originalright)\else\originalright#1\fi}
\makeatletter
\def\resetMathstrut@{%
\setbox\z@\hbox{%
\mathchardef@tempa\mathcode`[\relax
\def@tempb##1"##2##3{\the\textfont"##3\char"}%
\expandafter@tempb\meaning@tempa \relax
}%
\ht\Mathstrutbox@\ht\z@ \dp\Mathstrutbox@\dp\z@}
\makeatother
\begin{document}
$f(x+a)$ and $\mathbf{P}\left( y = (f(x)+1)^2 \right)$.
\end{document}
The output looks good to me (original above, mine below):

(x{=}a)– David Carlisle Oct 03 '20 at 14:26\left() so it would almost certainly break in real documents. But apart from that I think reducing the space around = is the more correct change than increasing the space around () – David Carlisle Oct 03 '20 at 14:34)to add space before in a way that does not break\right)would be hard (if I could think of a way at all) and would almost certainly not work in real documents, so the comments are just a warning that no answer coming from me, and I would be surprised if you get one at all. – David Carlisle Oct 03 '20 at 14:49\apply{f}{x+a}and\apply{\mathbf{P}}{x=a}then the\applymacrocan do\mathop{{}#1}\left(,#2,\right)` if that is what you want. – David Carlisle Oct 03 '20 at 14:54\leftand\rightbefore and have used my hacks for years with no trouble, so presumably it should be possible to hack(and)as well, but that is really too low-level for me. Regarding your last comment, it's too cumbersome. When my document is full of functions, I don't want to spend half my time typing macros, if there is a once-for-all solution (no matter how hacky). – user21820 Oct 03 '20 at 14:58