You can define an auxiliary macro and do the replacement.
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\makesum}{O{N}m}
{
\akkapelli_makesum:nn { #1 } { #2 }
}
\tl_new:N \l__akkapelli_makesum_template_tl
\cs_generate_variant:Nn \cs_set_protected:Nn { NV }
\cs_new_protected:Nn \akkapelli_makesum:nn
{
\tl_set:Nn \l__akkapelli_makesum_template_tl { #2 }
\tl_replace_all:Nnn \l__akkapelli_makesum_template_tl { #1 } { {##1} }
\cs_set_protected:NV __akkapelli_makesum_do:n \l__akkapelli_makesum_template_tl
__akkapelli_makesum_do:n { 1 } + __akkapelli_makesum_do:n { 2 } + \dots + __akkapelli_makesum_do:n { #1 }
}
\ExplSyntaxOff
\begin{document}
$\makesum{x^Ny^N}$
$\makesum{x^Ny_N}$
$\makesum[M]{(x^M y_M)^2}$
\end{document}
The optional argument (default N) is substituted in the second argument with #1, so we can define a macro based on it and use it.

However, I'd prefer a different approach: in the second argument you use #1 for the “variable part”:
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\makesum}{O{N}m}
{
\akkapelli_makesum:nn { #1 } { #2 }
}
\cs_new_protected:Nn \akkapelli_makesum:nn
{
\cs_set_protected:Nn __akkapelli_makesum_do:n { #2 }
__akkapelli_makesum_do:n { 1 } + __akkapelli_makesum_do:n { 2 } + \dots + __akkapelli_makesum_do:n { #1 }
}
\ExplSyntaxOff
\begin{document}
$\makesum{x^#1y^#1}$
$\makesum{x^#1y_#1}$
$\makesum[M]{(x^#1 y_#1)^2}$
$\makesum[100]{(x^{#1} y_{#1})^2}$
\end{document}
Note the necessary braces in the last case.

If integer exponents are used, it is better to cope with the “small” cases.
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\makesum}{O{N}m}
{
\akkapelli_makesum:nn { #1 } { #2 }
}
\cs_new_protected:Nn \akkapelli_makesum:nn
{
\cs_set_protected:Nn __akkapelli_makesum_do:n { #2 }
\regex_match:nnTF { \A [0-9]* \Z } { #1 }
{% numeric argument
\int_case:nnF { #1 }
{
{0}{0}
{1}{__akkapelli_makesum_do:n { 1 }}
{2}{__akkapelli_makesum_do:n { 1 } + __akkapelli_makesum_do:n { 2 }}
{3}{__akkapelli_makesum_do:n { 1 } + __akkapelli_makesum_do:n { 2 } + __akkapelli_makesum_do:n { 3 }}
}
{ __akkapelli_makesum_generic:n { #1 } }
}
{ __akkapelli_makesum_generic:n { #1 } }
}
\cs_new_protected:Nn __akkapelli_makesum_generic:n
{
__akkapelli_makesum_do:n { 1 } + __akkapelli_makesum_do:n { 2 } + \dots + __akkapelli_makesum_do:n { #1 }
}
\ExplSyntaxOff
\begin{document}
$\makesum{x^#1y^#1}$
$\makesum{x^#1y_#1}$
$\makesum[M]{(x^#1 y_#1)^2}$
$\makesum[1]{x^{#1} y_{#1}}$
$\makesum[2]{x^{#1} y_{#1}}$
$\makesum[3]{x^{#1} y_{#1}}$
$\makesum[4]{x^{#1} y_{#1}}$
$\makesum[100]{(x^{#1} y_{#1})^2}$
\end{document}
