Ok you are right, the problem seems to be somewhere in Tramp on require that sets the saved-value symbol property of connection-local-profile-alist and connection-local-criteria-alist without them being written to file, even when enable-connection-local-variables is set to nil. When custom-save-all naively scans the obarray for symbols, sees these variables having saved-value set without going through the customize machinary, it assumes they are saved to a file and saves them again.
On 4 Jun 2023 at 3:25 PM +0100, Eli Zaretskii <eliz@gnu.org>, wrote:
Date: Sun, 4 Jun 2023 15:00:01 +0100
From: Jimmy Wong <wyuenho@gmail.com>
Cc: 63891@debbugs.gnu.org

This branch: https://github.com/emacs-mirror/emacs/blob/emacs-29/lisp/cus-edit.el#L1109

I don't know what that is. I'm using the Emacs Git repository, the
emacs-29 branch.

No it does not saves only one variable to file, it only saves one variable to file if you have only modified
one variable.

That's not what I see. I've modified several options using the
menu-bar's Options menu, then typed

M-x customize-save-variable RET truncate-lines RET y

and saw that only truncate-lines was written to the custom file.

If you see something else, please show a complete recipe that
reproduces the behavior you see.

As a matter of fact, custom-variable-save, custom-variable-mark-to-reset-standard,
custom-face-save, custom-face-mark-to-reset-standard and custom-group-save all have the same
problem. They all call custom-save-all and they all dump all modified customizable variable values on
file without regard to whether it’s a single variable, face or a group the user asked Emacs to save.

I wasn't talking about custom-save-all -- that indeed saves all the
options customized in this session. I was talking about
customize-save-variable, which prompts for a single variable and its
value, and saves only that single variable, at least in my testing.