You have
GRUB_TIMEOUT_STYLE="hidden"
in /etc/default/grub but you also have the line
GRUB_HIDDEN_TIMEOUT="0"
in /etc/default/grub.
With the first one you tell Grub to hide the menu and with the latter you tell Grub to show the menu after 0 seconds.
You should remove the line
GRUB_HIDDEN_TIMEOUT="0"
from /etc/default/grub and then run sudo update-grub.
Here the essential part from the GRUB Manual:
‘GRUB_HIDDEN_TIMEOUT’
Wait this many seconds before displaying the menu. If ESC is pressed during
that time, display the menu and wait for input according to ‘GRUB_TIMEOUT’. If > a hotkey associated with a menu entry is pressed, boot the associated menu
entry immediately. If the timeout expires before either of these happens,
display the menu for the number of seconds specified in ‘GRUB_TIMEOUT’ before
booting the default entry.
If you set ‘GRUB_HIDDEN_TIMEOUT’, you should also set ‘GRUB_TIMEOUT=0’ so that > the menu is not displayed at all unless ESC is pressed.
This option is unset by default, and is deprecated in favour of the less
confusing ‘GRUB_TIMEOUT_STYLE=countdown’ or ‘GRUB_TIMEOUT_STYLE=hidden’.
Another possibility is Grub's built-in recordfail-function. Whenever a menu-entry is chosen (manually or automatically), Grub will set the variable recordfail=1 and saves it in /boot/grub/grubenv.
During boot the variable will be unset by systemd if the boot is successful, if the boot fails, the variable will remain unchanged in /boot/grub/grubenv.
Everytime time Grub starts, Grub will read /boot/grub/grubenv and checks if recordfail is set to 1. So Grub will know if the last boot succeeded or not. If the last boot wasn't successful, Grub will override your settings from /etc/default/grub to display the boot menu for 30 seconds.
You can check the content of /boot/grub/grubenv with
cat /boot/grub/grubenv