Are there risks / pitfalls with using ln -s to link a virtualenv into a local venv within a project directory structure?
ln -s creates a soft link (or symbolic link), think of it like a shortcut on Windows, so it's as much safe as you would do operation in the target directory itself.
After creating the symlink, when someone accesses the [PROJECT_HOME]/venv link, they will be acessing ~/.virtualenvs/my_env directory (transparently done by the kernel). So all operations will be happening on the target directory (~/.virtualenvs/my_env) as you can imagine.
Also check man ln to get more idea on links.

But using a symlink would break imports as Python does not check for symlinks then. So unless you've set up PYTHONPATH or sys.path correctly to include the symlink directory as well, things would break as far as import machinery is concerned.
But as it's a virtualenv directory, I think it's safe.
I have all my virtual environments in ~/.virtualevs. I am working with a python / flask project that wants to have [PROJECT_HOME]/venv be the virtual environment. 
Am I at risk of things breaking and unexpected results if I ln -s ~/.virtualenvs/my_env [PROJECT_HOME]/venv? Or will that just work as expected?
I've set this up and it works. For now. But feels 'klugey'