It's a bug in linguex that, for strange reasons, wants to use the minimum width of digits, instead of the maximum!
With a font such as Brill, where the minimal width digit is 1, this spoils all computations for the label width. So I redefine \minimalwidth to be really \maximalwidth.
\documentclass{memoir}
\usepackage[no-math]{fontspec}
\setmainfont{Brill}
\usepackage{mathastext}
\usepackage{linguex}
\usepackage{etoolbox}
\patchcmd{\minimalwidth}{<}{>}{}{}% it should be maximal width!
\AtBeginDocument{%
\settowidth{\Exlabelwidth}{(000)}%
}
\begin{document}
\ex. [$_S$ [$_{NP}$ Bartoli] [$_{VP}$ zoent Pavarotti]]
\setcounter{ExNo}{49}
\ex. [$_S$ [$_{NP}$ Bartoli] [$_{VP}$ zoent Pavarotti]]
\ex. [$_S$ [$_{NP}$ Bartoli] [$_{VP}$ zoent Pavarotti]]
\setcounter{ExNo}{99}
\ex. [$_S$ [$_{NP}$ Bartoli] [$_{VP}$ zoent Pavarotti]]
\end{document}
Note that mathastext should go after setting the main font.

You may prefer a different solution, using fixed width digits in the context of \ex (but this will change all numbers in the context).
\documentclass{memoir}
\usepackage[no-math]{fontspec}
\setmainfont{Brill}
\usepackage{mathastext}
\usepackage{linguex}
\usepackage{etoolbox}
\preto{\listdecl}{\addfontfeatures{Numbers=Monospaced}}
\AtBeginDocument{%
\settowidth{\Exlabelwidth}{(000)}%
}
\begin{document}
\ex. [$_S$ [$_{NP}$ Bartoli] [$_{VP}$ zoent Pavarotti]]
\setcounter{ExNo}{49}
\ex. [$_S$ [$_{NP}$ Bartoli] [$_{VP}$ zoent Pavarotti]]
\ex. [$_S$ [$_{NP}$ Bartoli] [$_{VP}$ zoent Pavarotti]]
\setcounter{ExNo}{99}
\ex. [$_S$ [$_{NP}$ Bartoli] [$_{VP}$ zoent Pavarotti]]
\end{document}
