I retract my comment about "no matter what", but it still just boils down to running sqlite on a separate thread. In my opinion it's probably a lot easier to run sqlite in a separate thread (or process) yourself at the app-level. The code for writing async native bindings in node is very complicated (not even considering the thread pool), and you probably don't need every single operation to be async. That just adds a lot of overhead, when you probably just need a higher-level layer that says "execute these queries on the sqlite process and give me the results".
What that article is saying is that libuv exposes a thread pool that you can opt in to with a native extension instead of bringing your own.
It doesn't mean a synchronous API won't block.
For example, https://nodejs.org/api/crypto.html#crypto_crypto_randombytes... without the callback blocks.
You said "Just because SQLite's API is synchronous does not mean that it must block the node process." I'm saying that's not true.
A function might use threads behind the scenes, but if you're going to synchronously wait for it, you're blocking the event loop.