Here, I make use of an internal macro from the tokcycle package.
The \count@stringtoks macro is used to count the tokens that make up the \string of the argument. We rely on the fact that the \string of a character token will be a single byte in length, whereas the \string of any macro token will be at least two bytes in length. Using this criterion, we can differentiate a macro from a character.
Best of all, \count@stringtoks is fully expandable.
\documentclass{article}
\usepackage{tokcycle}
\makeatletter
\newcommand\extractFirst[1]{\testfirst#1\relax\relax}
\def\testfirst#1#2\relax{\tctestifnum{\count@stringtoks{#1}>1}{Macro}{Character}}
\makeatother
\begin{document}
\extractFirst{abc}
\extractFirst{a}
\extractFirst{\abc ab\c}
\extractFirst{\a ab\c}
\end{document}

If you wanted to avoid loading the package, the extracted code necessary to recreate the \count@stringtoks macro is this:
\documentclass{article}
\makeatletter
\newcommand\extractFirst[1]{\testfirst#1\relax\relax}
\def\testfirst#1#2\relax{\tctestifnum{\count@stringtoks{#1}>1}{Macro}{Character}}
% FROM TOKCYCLE:
\long\def\count@stringtoks#1{\tc@earg\count@toks{\string#1}}
\long\def\count@toks#1{\the\numexpr-1\count@@toks#1.\tc@endcnt}
\long\def\count@@toks#1#2\tc@endcnt{+1\tc@ifempty{#2}{\relax}{\count@@toks#2\tc@endcnt}}
\def\tc@ifempty#1{\tc@testxifx{\expandafter\relax\detokenize{#1}\relax}}
\long\def\tc@earg#1#2{\expandafter#1\expandafter{#2}}
\long\def\tctestifnum#1{\tctestifcon{\ifnum#1\relax}}
\long\def\tctestifcon#1{#1\expandafter\tc@exfirst\else\expandafter\tc@exsecond\fi}
\long\def\tc@testxifx{\tc@earg\tctestifx}
\long\def\tctestifx#1{\tctestifcon{\ifx#1}}
\long\def\tc@exfirst#1#2{#1}
\long\def\tc@exsecond#1#2{#2}
\makeatother
\begin{document}
\extractFirst{abc}
\extractFirst{a}
\extractFirst{\abc ab\c}
\extractFirst{\a ab\c}
\end{document}
\it gets a single token which prints as a\abccommand name but is internally a single entry in the table of defined commands . – David Carlisle Feb 06 '20 at 11:56