I have this same problem. Take a look at your /boot/grub/grub.cfg.
Notice all of the "/root/boot/*" entries? update-grub (grub-mkconfig) is
picking up an incorrect path.
Workarounds:
1) As root, "cd /root; ln -s ../boot", update-grub/grub-install. Now the
incorrect path in grub.cfg exists and you no longer have to perform the
set prefix=hd* command.
2) Edit /boot/grub/grub.cfg. Replace all "/root/boot/*" with "/boot/*".
You'll have to do this after every update-grub.
I manage many debian testing/buster installations on real hardware with
a btrfs. The disk has two partitions, sda1 (grub boot partition 2M),
sda2 (btrfs). sda2 has a btrfs filesystem. There is one subvol entitled
root/subvolid 257. I use btrfs su set-default 257). update-grub
generates a good grub.cfg with initrd at /boot/*.
I never have this problem.
I do experience this bugid with my cloud linode setup. linode uses one
disk /dev/sda and qemu to boot the testing/buster image. When I perform
update-grub, the grub.cfg has the "/root/boot" entries.
So the differences are:
1) Use partitions, root os on a subvolid id works.
2) Use a disk with no partitions, update-grub/grub-mkconfig generates
incorrect /root/boot/* entries for all menu entries.
Hope this helps.