A process is responsible for managing its own current directory. There's no way to change it from the outside.
You can cheat, by making the process change its own directory. If you're running as root, or as the same user as the process, you can use the ptrace system call to do all manner of invasive things on a process, including changing its memory under its nose and performing system calls. This is what debuggers use.
Treat this like an experimental surgical operation. The patient may wake up unscathed or die. This should work if the process doesn't really care what its current directory is. A program that has an intimate relationship with its current directory, such as a shell, is unlikely to survive.
Here's a script I've used in the past to move processes out of hung NFS mounts. Use at your own risk.
#!/bin/sh
if [ $# -ne 2 ]; then
echo 1>&2 "Usage: $0 PID DIR"
exit 120
fi
case "$1" in
*[!0-9]*) echo 1>&2 "Invalid pid \`$1'"; exit 3;;
esac
case "$2" in
*[\\\"]*)
echo 1>&2 "Unsupported character in directory name, sorry."
exit 3;;
esac
gdb -n -pid "$1" -batch -x /dev/stdin <<EOF
call chdir("$2")
detach
quit
EOF