Weird as it may sound,
ln -si ../../../GIT/Settings/session ./.mozilla/firefox/foo.default/
will do what you want. The rule of thumb here is that you should specify your link targets relative to the location where you're placing the link.
On Unix and Unix-like file systems, a symbolic link is actually a special file whose contents are a path. Typing
ln path filename creates a symbolic link at filename whose contents are path. So if, for instance, you type
ln foo bar/baz
then your system will create a link named bar/baz containing the path "foo". That link, however, will be broken – when you try to dereference the link, your kernel dereferences it relative to the link directory – in this case, bar. Your kernel will look for bar/foo, which does not exist.
If, on the other hand, you type
ln ../foo bar/baz
then your system will create a link named bar/baz containing the path "../foo". Dereferencing this link, your kernel will look for bar/../foo, which does exist (and is in fact what you want).