You can use matching instead of splitting:
(?:(?:\((?>[^()]+|\((?<number>)|\)(?<-number>))*(?(number)(?!))\))|[^,])+
See demo
This part - \((?>[^()]+|\((?<number>)|\)(?<-number>))*(?(number)(?!))\) - corresponds to balanced brackets, and this is [^,] - any character, but a comma.

See the IDEONE demo :
var line = "[A] == [B] * 10 - FUNCTION([C], STRING_EXPRESSION, FUNCTION([D],[C],[E])), FUNCTION([C], [X]), 100"; var matches = Regex.Matches(line, @"(?:(?:\((?>[^()]+|\((?<number>)|\)(?<-number>))*(?(number)(?!))\))|[^,])+"); foreach (Match m in matches) Console.WriteLine(m.Value.Trim());
Output:
[A] == [B] * 10 - FUNCTION([C], STRING_EXPRESSION, FUNCTION([D],[C],[E])) FUNCTION([C], [X]) 100
source share