Thanks for comment by Mico, this is the suggested pattern to use. PS. I am not a pattern matching expert and do not play one on TV, but the nice thing about lualatex is one can employ sophisticated pattern matching procedures if they are needed.
\documentclass{article}
\usepackage{luacode} % for '\luaexec' and '\luastring' macros
\newcommand{\FirstWord}[1]{\luaexec{tex.print(string.match(\luastring{#1}, '\%w+\%-?\%w*'))}}
\begin{document}
\def\lst{John, Paul, George and Ringo}
\textbf{\FirstWord{\lst}} is the first word in \{\lst\}
\def\lst{-John, Paul, George and Ringo}
\textbf{\FirstWord{\lst}} is the first word in \{\lst\}
\def\lst{Marie-Claire, Paul, George and Ringo}
\textbf{\FirstWord{\lst}} is the first word in \{\lst\}
\end{document}
gives

Earlier version
lualatex solution
Updated with another variation of the call just for illustration.
\documentclass{article}
\usepackage{luacode}
\newcommand{\FirstWord}[1]{\luaexec{tex.print(string.match('#1', '([^,]+)'))}}
\begin{document}
\def\lst{John, Paul, George and Ringo}
\textbf{\FirstWord{\lst}} is the first word in \{\lst\}
\end{document}
The above does not handle special cases such as {{John, Paul}, George and Ringo}
. It will still return John
for the above.
Original answer
\documentclass{article}
\usepackage{luacode}
\begin{luacode*}
function FirstWord(arg)
tex.print(string.match(arg, '([^,]+)'))
end
\end{luacode*}
\newcommand{\FirstWord}[1]{\directlua{FirstWord("#1")}}
\begin{document}
\def\lst{John, Paul, George and Ringo}
\textbf{\FirstWord{\lst}} is the first word in \{\lst\}
\end{document}
gives

shorthand
andshortauthor
. Besides, I can't force possible users to use lualatex. So I'm going with his code, even though the lua option is really cool. :)