It pays to read the documentation. Had I read it more thoroughly, I would have known about this before debugging it and wasting time. Oops!
Turns out there is bug with VirtualBox's shared folder support and sendfile. This bug was preventing the VM from serving new versions of any file in the shared directory. Obviously this is not good for web development.
The solution is easy enough. You just have to disable sendfile in your web server.
The Vagrant documentation does include some information it: https://docs.vagrantup.com/v2/synced-folders/virtualbox.html