Another possibility would be to change filemon(4) to do fd_getfile each it needs to use the file descriptor. This makes it a little more brittle (fails if you close the descriptor), but would sidestep the problem.
Another possibility would be to use fd_getfile2/closef, which holds a reference only on the file, instead of fd_getfile/fd_putfile, which holds a reference on the file and on the descriptor. Releasing the reference to the file may not a problem, even though releasing the reference to the descriptor is a problem as you found.