This is happening because when $regsub reaches the * char, the subpattern that matches it is this: [^-a-z]
ie the first subpattern in the (). So, it removes the star and moves on. It won't remove the last "a" because the * char was dealt with in the previous run. Now, the only thing $regsub sees is an "a", which of course does not remove. This is the nature of consuming subpatterns, like (pattern), (?:pattern). Non-consuming subpatterns are the assertions: negative/positive lookahead/lookbehind assertions, the \b etc.
There are two ways to do what you want: the simplest one is to just change the order of the subpatterns:
//var %y,%x = $regsub(a-b-c-d*a,/(\*[a-z]+?|[^-a-z])/g,,%y) | echo -a %y
Another way would be to insert a positive lookbehind assertion in front of the second subpattern:
//var %y,%x = $regsub(a-b-c-d*a,/([^-a-z]|(?<=\*)[a-z]+)/g,,%y) | echo -a %y