Depends on what your use-case is, really. Among other things, Site-to-Site VPNs, BGP/OSPF, and traffic policies, are easier to
implement in VyOS, in my opinion.
One feature pfSense is severely
lacking is something similar to VyOS's "commit-confirm" and a separation from the current, running configuration and the saved configuration. With pfSense, while infrequent and usually (but not always!) user error, I've applied changes that lock, or otherwise block access to, the system. This is particularly hard to deal with, especially if the system is remote; asking someone to go reboot it won't even help (the changes are already saved).
With VyOS, you commit your changes before saving them. If something completely breaks, just reboot the machine. Optionally, if you're making configuration changes on a remote machine, you can "commit-confirm" to commit the changes. Then, if you don't "confirm" the changes in 10 minutes, the machine automatically reboots and loads the previous configuration, allowing you to reconnect. You can also roll back to previous, known-working configuration versions or VyOS versions fairly easily. This is similar to managed switches with a "running config" and a "saved config." You don't realize how nice this is until the first time it saves you from a major headache!
TNSR has the same functionality (TNSR docs)
, but pfSense completely lacks it.