No need to reinvent the wheel. ;-)
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\ifmember}{mmmm}
{
\clist_if_in:onTF { #2 } { #1 } { #3 } { #4 }
}
\cs_generate_variant:Nn \clist_if_in:nnTF { o }
\ExplSyntaxOff
\begin{document}
\ifmember{3}{3,4}{True}{False} (expected: True)
\ifmember{3}{ 3 ,4}{True}{False} (expected: True)
\newcommand{\foo}{3,4}
\ifmember{3}{\foo}{True}{False} (expected: True)
\renewcommand{\foo}{3, 4}
\ifmember{4}{\foo}{True}{False} (expected: True)
\ifmember{foo}{\foo}{True}{False} (expected: False)
\end{document}
\clist_if_in:<args>
has the comma separated list in the first argument, the item to look for in the second one.
To be honest, I'd better split the check into two variants: one for a “naked” argument, one for a control sequence:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\ifmember}{smmmm}
{
\IfBooleanTF{#1}
{% explicit argument
\clist_if_in:nnTF { #3 } { #2 } { #4 } { #5 }
}
{% implicit argument
\clist_if_in:VnTF #3 { #2 } { #4 } { #5 }
}
}
\cs_generate_variant:Nn \clist_if_in:nnTF { V }
\ExplSyntaxOff
\begin{document}
\ifmember*{3}{3,4}{True}{False} (expected: True)
\ifmember*{3}{ 3 ,4}{True}{False} (expected: True)
\newcommand{\foo}{3,4}
\ifmember{3}{\foo}{True}{False} (expected: True)
\renewcommand{\foo}{3, 4}
\ifmember{4}{\foo}{True}{False} (expected: True)
\ifmember{foo}{\foo}{True}{False} (expected: False)
\end{document}

Anyway, here's a solution for your code: reverse the arguments, so you can easily reach the second with \expandafter
.
\documentclass[11pt,letterpaper]{article}
\makeatletter
\newcommand\ifmember[2]{%
\expandafter\ifmember@aux\expandafter{#2}{#1}%
}
\newcommand\ifmember@aux[2]{%
\in@{,#2,}{,#1,}%
\ifin@
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}
\makeatother
\begin{document}
\ifmember{3}{3,4}{True}{False}
\newcommand{\foo}{3,4}
\ifmember{3}{\foo}{True}{False}
\end{document}