This is not basically possible, and I'll try to explain why, on an example.
Let's \show\section:
\section=\long macro:
-> \@startsection {section}{1}{\z@ }{-3.5ex \@plus
-1ex \@minus -.2ex}{2.3ex \@plus .2ex}{\normalfont \Large \bfseries }
Ok, not much to see, other than that \section takes no arguments at all! So let's \show\@startsection:
\@startsection=macro:
#1#2#3#4#5#6->\if@noskipsec \leavevmode \fi \par \@tempskipa #4\relax \@afterindenttrue
\ifdim \@tempskipa <\z@ \@tempskipa -\@tempskipa \@afterindentfalse \fi
\if@nobreak \everypar {}\else \addpenalty \@secpenalty \addvspace \@tempskipa \fi
\@ifstar {\@ssect {#3}{#4}{#5}{#6}}{\@dblarg {\@sect {#1}{#2}{#3}{#4}{#5}{#6}}}
Voilà! It is the \@ifstar in the definition of \@startsection that tells you that \section has a starred variant. How does it work? Notice that \section passes to \@startsection all the 6 mandatory arguments, therefore if you write \section*{BLA}, it becomes \@startsection{<6 arguments>}*{BLA} and this becomes blablabla \@ifstar {\@ssect {#3}{#4}{#5}{#6}}{\@dblarg {\@sect {#1}{#2}{#3}{#4}{#5}{#6}}}*{BLA}. Finally, \@ifstar is a crazily-made command that has two arguments, 1st is used if * follows and 2nd if not.
So, as you can see, checking whether a starred variant of a command is defined, is really not simple. Not to mention that \@ifstar is not the only way how to define a starred variant of a command. The problem is that the star is not a part of the name of the command, it is a first optional argument.