それにしても見れば見るほどに、奥が深いですね〜

まずは、短いところから始めました。
正規表現で抜き出した部分を切り捨てないで弄ってみる

var parseTDCSort = function () {
    var Patterns = new RegExp (
        '(?:' +
            '(\"[^\"]+\"|\'[^\']+\')' + // Atom("..." か '...' の文字列)
            '|([^-+;\\s]+)' + // Atom(演算子以外の文字からなる識別子)
            '|([-+])' + // '+', '-'
            '|(;)' + // ';'
            '|(\\s+)' + // 無視する空白
        ')', 'g');
    
    return function (stringData) {
        var result = [ ];
        var dir = null;
        var ref = null;
        var paterns = new RegExp (Patterns); //←こっそり訂正
        
        for (var cmp, qmp; (cmp = Patterns.exec (stringData)); ) {
            
            if ((qmp = cmp[1])) {
                if (ref) {
                    throw new Error ('malformed TDC sort');
                }
                ref = qmp.slice (1, -1);
                continue;
            }
            if ((qmp = cmp[2])) {
                if (ref) {
                    throw new Error ('malformed TDC sort');
                }
                ref = qmp;
                continue;
            }
            if ((qmp = cmp[3])) {
                if (dir) {
                    throw new Error ('malformed TDC sort');
                }
                dir = qmp;
                continue;
            }
            if ((qmp = cmp[4])) {
                if (ref) {
                    result.push (dir || '+', ref);
                }
                dir = ref = null;
                continue;
            }
        }
        
        if (dir && ! ref ) {
            throw new Error ('謎の文字があります');
        }
        if (ref) {
            result.push (dir || '+', ref);
        }

        return result;
    };
} ();


構文のエラーを無視するならば?

var str ='abc; -def; +ghi';
var reg = /\s*([\-\+])?([^\-\+]+)\s*(?:;|$)/g;

while ((t = reg.exec (str)))
  result.push (t[1] || '+', t[2]);