Short answer: it's tough, and perhaps impossible to provide a fully robust solution since finding out whether a given cr is the last one is very difficult: after a \cr, TeX scans ahead, ignoring spaces (at least plain (32,10) ones) and \crcr, and expanding everything else, except eTeX's protected control sequences, until finding a non-expandable token. TeX then inserts the template, except in the following cases:
\noalign starts a new group inserted between lines of the tabular
\omit starts the cell normally, but without inserting the template
- a catcode 2 token (closing brace or
\egroup) ends the \halign.
Two more things I can think of which interact with what TeX is doing there are \aftergroup and \everycr. After a \cr (or a non-redundant \crcr, i.e., one that is not ignored by TeX scanning ahead after a \cr), the content of \everycr are inserted, immediately followed by \aftergroup-ed tokens, and then the following characters in the file. The resulting token list is read by TeX as I explained, expanding as it goes, ignoring spaces and \crcr.
We thus need to detect closing braces after any \cr. This requires a non-expandable \futurelet, which as you say breaks the \noalign mechanism. The solution is along the lines of \everycr{\noalign\bgroup\test}, where \test checks what the next token is, then closes the \noalign group (it will insert a height-zero vertical box in the page, but I think that that changes nothing to the output.
Code. The easiest way I can think of is to use the \everycr token parameter. I'm using eTeX's \currentgrouplevel to only insert the special bit of \noalign for \cr which appear in the outer table, not nested tables. The external group is not really needed either (just to keep changes to \everycr local). The main idea is that after each \cr, a \noalign\bgroup\futurelet... is inserted to check if that was the last cr (it was if we find a closing brace). This probably has bad interactions with redundant/non-redundant \crcr, and also has other drawbacks, I would guess. I commented out the \romannumeral-\`0: it is useful if you fear that the last \cr won't be immediately followed by the closing brace.
\def\mytab{%
\begingroup
\everycr\expandafter{%
\expandafter\mytabcr
\the\expandafter\currentgrouplevel\expandafter;%
\the\everycr}%
\afterassignment\dotab
\let\dummy=%
}
\def\dotab{%
\halign\bgroup
\hfil\ignorespaces##\unskip\cr
}
\def\mytabcr#1;{%
\ifnum\numexpr#1-2=\currentgrouplevel %not sure about that 2
\noalign\bgroup
\expandafter\mytabcrX %\romannumeral-`0%
\fi}
\def\mytabcrX{\futurelet\mytabcrtoken\mytabcrtest}
\def\mytabcrtest{%
\ifcat\noexpand\mytabcrtoken\egroup
\aftergroup\mytabcrend
\else
\egroup
\fi}
\def\mytabcrend{\egroup\dosomethingafter\endgroup}