In a conventional architecture, the server decides what each request may see. In a local-first architecture, the client holds data, so the sync layer must decide what to send before the client asks for it, and must reject writes it shouldn't accept.
This is where products in this category differ most, and where the demos are least representative. A demo app has one user and no permissions. Your app has teams, roles, sharing, and rows that become visible when someone is added to a project.
Ask three questions of any candidate. How are read rules expressed, and are they enforced server-side rather than trusted from the client? What happens when a user's access is revoked, does data already on their device get removed, and how quickly? And can rules be expressed per row and per field, or only per collection?
Then design your schema so permission boundaries align with sync boundaries. If a client syncs a workspace, make the workspace the unit of permission. Fighting that alignment later means either over-syncing data users shouldn't have or writing filtering logic in two places, and both are the kind of mistake you find out about in a security review.