You can accomplish some of what lsof does with a command like the following.
find /proc/*/map_files -ls | grep '(deleted)'
The names of the symlinks reported in that output include ranges in hexadecimal, which might correspond in some cases to file sizes. Only symlink targets within your full filesystem (/) are likely to be relevant in this context. It might be particularly useful to check for unlinked open files in /var/log.
If you find a suspicious unlinked open file that way, its name should include the process ID of the process which opened it, and killing that process (or rebooting) should release the space occupied by that file.
Another place to look for hidden space, besides unlinked open files (which, if lsof is installed, it can report), is mount points. If another volume is mounted over a nonempty mount point, the disk usage beneath that mount point won't be reported by du.
If it's not convenient to unmount a volume, it might be possible to explore what's underneath a mount point by exporting / via NFS and mounting it, and running du in the NFS mount. That should work unless the NFS server includes data from other volumes in what it exports. That approach might not help if it requires installing additional packages.