Pergunta esplêndida!
Em primeiro lugar, vamos fazer algumas suposições sobre "melhor".
Estou assumindo que você não se importa muito com o espaço em disco - uma máscara de bits é eficiente do ponto de vista do espaço, mas não tenho certeza se isso importa muito se você estiver usando o SQL Server.
Estou assumindo que você se preocupa com a velocidade. Uma máscara de bits pode ser muito rápida ao usar cálculos - mas você não poderá usar um índice ao consultar a máscara de bits. Isso não deve importar muito, mas se você quiser saber quais usuários têm acesso de criação, sua consulta seria algo como
select * from user where permsission & CREATE = TRUE
(não tenho acesso ao SQL Server hoje, na estrada). Essa consulta não seria capaz de usar um índice por causa da operação matemática - portanto, se você tiver um grande número de usuários, isso seria bastante doloroso.
Estou assumindo que você se preocupa com a manutenção. Do ponto de vista da manutenção, a máscara de bits não é tão expressiva quanto o domínio do problema subjacente como armazenar permissões explícitas. Você quase certamente teria que sincronizar o valor dos sinalizadores de máscara de bits em vários componentes - incluindo o banco de dados. Não impossível, mas dor nas costas.
Portanto, a menos que haja outra maneira de avaliar "melhor", eu diria que a rota de máscara de bits não é tão boa quanto armazenar as permissões em uma estrutura de banco de dados normalizada. Eu não concordo que seria "mais lento porque você tem que fazer uma junção" - a menos que você tenha um banco de dados totalmente disfuncional, você não poderá medir isso (enquanto a consulta sem o benefício de um índice ativo pode se tornar visivelmente mais lento, mesmo com alguns milhares de registros).