Update #2: I figured it out. On boots which follow unsuccessful boots, GRUB disables its own timeout. Since showing the menu makes a boot unsuccessful, this is an inescapable loop. This behaviour may be disabled by editing the /etc/grub.d/00_header file, and changing the make_timeout function:

make_timeout ()
{
echo "set timeout=0"
}

Now exit and re-run the grub configuration updater script:

sudo update-grub2

It makes no sense to me that this behaviour would be the default for Ubuntu Server, a product intended for machines accessed by console.

I came across this deeply unpleasant design oversight with Ubuntu Server 9.10. Your fix has helped me enormously. I just wanted to point out that the fix needed for 9.10 is different as there is no "make_timeout ()" function in the same file.

For Ubuntu 9.10, go to the end of the same file (00_header) and change the following:

Brilliant solution, have been wondering how to do this, works perfectly! Note: When you update grub, you only need to run: "sudo update grub" regardless of whatever version of grub you are running.
–
user79013Apr 20 '11 at 17:26

This has just saved my bacon - my server's been sat at the grub menu on every reboot for a week - had no idea what was wrong and had tried everything. This and the tip in the question did it. Thanks so much.
–
Darren GreavesApr 12 '12 at 12:35

Configure GRUB for serial access (and your bootloader, while you are at it) and keep an open serial port, null-modem cable, and USB-to-RS232 converter handy for these instances. I run a headless server and a Guruplug and wouldn't have it any other way.