If you want a device to talk to a global address it needs a global address.
Not quite. It can, provided it doesn't have to go over the public Internet. PfSense can easily route between global and ULA addresses. I have done that here. This is no different than using RFC 1918 addresses on IPv4.
But your client will have to have one if you want to be able to talk to stuff via that linklocal transit your using upstream of pfsense.
Here we go again. Global addresses are not normally used for routing. As I pointed out recently in another thread, routing is done using link local addresses between routers. Check your routing table to verify. You can also capture router advertisements to see what address is provided for routing. However, those global addresses are definitely useful for management and diagnostic purposes.
But sure it is possible to do such routing with linklocal, or use a ULA as your transit IP scheme, etc.
Once again, link local addresses are always used for routing, unless specifically configured otherwise. Take a look at your routing table in pfSense and computer operating systems. You will see link local addresses. For example, here is the default IPv6 route on the Linux computer I'm currently sitting at:
default via fe80::1:1 dev eth0 proto ra metric 1024 expires 46sec hoplimit 64 pref medium
As you can see, it's a link local address, as provided by pfSense. Further, it's entirely possible for a router to have the same link local address on multiple interfaces. It's only necessary to have unique link local addresses for devices on any given link. This would not be possible with a routable address.
As I mentioned in other threads, many things in IPv6 are different from IPv4. You need to update your understanding of this. There is one other difference shown in that default route that goes to another disagreement we had a while back. Do you see that "medium" at the end of the line? That refers to router priority. By changing that, you could have multiple default routes, possibly via alternate ISPs, simply by assigning different priorities, as pfSense can do. Then should the primary default route fail, another can then be used. This is part of IPv6 and can only be accomplished in IPv4 by using a first hop redundancy protocol.