It is bash and so $ generally introduces a variable substitution. You might have some luck with making sure that the --server parameter is not being interpreted in some odd way by quoting it:
tiddlywiki /home/rich/Dropbox/FiddlyWiki --server '$:/core/save/lazy-all'
Your shebang line does not look quite right either:
#! /bin/bash
should be without spaces:
#!/bin/bash
or
#!/usr/bin/env bash
I am guessing the incorrect shebang line might be causing the desktop launcher's Exec directive to fail or use sh (though it would not explain why the process shows up in the system monitor.)
killall node is a bit of a blunt instrument. On some flavors of Linux you might find pkill -f tiddlywiki would be sure that the correct process running node is being killed successfully.
Last, the bare tiddlywiki command - one presumes tiddlywiki is in the PATH that ,xdg-open gives to the process running the refiddle shell script and that the location of the correct version of node is in the environment that tiddlywiki's shebang line is going to get. Setting your path expectations in the refiddle script
export PATH=/where/tiddlywiki/is:/where/node/is:${PATH}
might address mysterious behavior. Again, I am mystified why the node process would continue to show up in the process list.
Those are all the ideas that occur to me.