I think I really prefer Things’ interface and UX because it is powerful while not seeming extremely intricate and complex. It’s opinionated in ways that aren’t as restrictive as I’d have feared.
I like Todoist quite a bit and its customizability with tags/filters is superior to Things (other than tag hierarchies) but its interface can be quite complicated.
OmniFocus is very complicated and while I do occasionally geek out about the advanced task scheduling strategies possible in OmniFocus, it is also very easy for my Autistic obsession tendencies to lead me to create quite a mess inside it.
My current choice is Todoist solely because of its new REST API. Because its API allows me to access my data as I wish I can integrate it with my existing automation systems in a way that gets the task scheduling/completion part of my productivity system out of my way. As I said, I like Things 3 and while it does recently have URL Schema support it really leaves a lot to be desired for me1.
For now, the superior flexibility of access to my data is making the decision for me.
1 For example, you can create tasks but not retrieve a list of them as JSON. At the very least I’d like to be able to filter for tasks as the UI allows and receive an array of those tasks in JSON form.