One idea would be to override
/usr/foo but only for the misbehaving application. The misbehaving application would see
/usr/foo as an alias for
/bigdata but every other process in the system would continue to see
/usr/foo's real contents including the files that are actually in there. This assumed the misbehaving application doesn't care that the normal contents of
/usr/foo are inaccessible to it.
sudo unshare --mount sh -c 'mount --make-rprivate / &&
mount -n --bind /bigdata /usr/foo &&
exec su "$SUDO_USER" -c misbehaving_application'
Otherwise, OverlayFS might solve your problem, as suggested in the comments.
Finally, as a last resort, some symlink gymnastics can do the trick. The idea would be to:
bind mount a copy of
/usr/foo somewhere else
mount --bind /usr/foo /writable/place/foo
/usr/foo with your replacement directory
mount --bind /bigdata /usr/foo
Symlink the existing files so they can be accessed from /usr/foo
for x in /writable/place/foo/*; do
ln -s "$x" /usr/foo