chrpath can’t add an RPATH tag if one isn’t present, and it can’t extend one; as a result, the new path must be of equal length to or shorter than the existing path. Your library started out with a RUNPATH set to ../lib, so chrpath can only replace that with a path of six characters at most.
patchelf doesn’t have that limitation.
You can set LD_LIBRARY_PATH for the forked process in execve pointing to a directory with your custom version of foo.so. More about shared libraries and environmental variables that control the loading process here.