Мне думается, Sequilize тяжелый для таких вещей и сложных запросов.
Можете попробовать
knex.
В одном месте создаете подзапрос с динамическими where условиями в зависимости от ролей пользователя. Потом в отчетах и других селектах обращаетесь не к таблице, а к ограниченному подзапросу. По такому принципу:
const ClientsSubQuery = knex.select(1).as('clients');
const query = knex.select('*').from(ClientsSubQuery);
console.log(query.toSQL());
Похоже на вьюшки, только без недостатков, все на стороне приложения и более функционально. Например, если пользователь имеет несколько ролей и нужно данные по их всем where-условиям на определенную таблицу.
Определиться нужно ли вам ORM можете глянув это видео:
https://www.youtube.com/watch?v=bkDUIIho70o
Можно и без ORM сделать хорошее приложение.
Если очень хочется, можете использовать Objection.js или Bookshelf.js. Это более понятные ORM (в отличии от Sequilize), основаные на knex и скорее всего совместимые с подходом показанным выше.
P.S.: knex умеет миграции и много чего другого. При желании, как и с ORM, вы свое приложение потом сможете переключить например с MySQL на Postgres или наоборот