The decorations.text library with its text along path is the absolutely the right approach. (You could try to manually place each letter along a curve but that's no fun.)
However, you can simply keep using one loop and a few smart styles to to this more manually.
But first, you can use the /utils/count list key to simply count the number of elements in a PGFFor list. There's no need to \xdef (and overwrite globally) a macro.
The euler node key creates a circular node with the needed diameter and colors. For the last (and smallest) node, the euler node/1 style will be executed which simply places a label at the center of the node.
For all other nodes, the euler node/not 1 will be used. (The euler node/1 key disables it.)
This adds a “circular label”, i.e. another circle as a label that's euler margin smaller than the parent node. This label is rotated so that the start of the circle is at the bottom.
This circle will be decorated. The value euler margin is set up so that the text is somewhat centered between the areas. (5mm is half the space between the areas and 0.3em is needed to adjust the baseline of the text further.)
In the second example you can see by just disabling the euler node/1 key that all labels are placed along an arc.
Code
\documentclass[tikz, 12pt]{standalone}
\usetikzlibrary{through, decorations.text}
\pgfkeys{
/utils/count list/.style 2 args={
/utils/exec=\def#2{0},
/utils/temp/.code=\edef#2{\pgfinteval{#2+1}},
/utils/temp/.list={#1}}}
\colorlet{euler1}{red}
\colorlet{euler2}{blue}
\colorlet{euler3}{yellow}
\colorlet{euler4}{green}
\tikzset{
circular label/.style n args={4}{label={[% works best with a circle
rotate={-(#1)},
circle through={([xshift={#2}]\tikzlastnode.west)},
decorate, decoration={text along path, text align=center,
reverse path, text color={#3}, text={#4}}]center:}},
euler margin/.initial=.3em+5mm,
euler radius/.initial=10mm,
euler node/1/.style 2 args={
label={[euler#1!30!black]center:{#2}},
euler node/not 1/.code=},
euler node/not 1/.style 2 args={
circular label={90}{\pgfkeysvalueof{/tikz/euler margin}}
{euler#1!30!black}{#2}},
euler node/.style n args={3}{
shape = circle, draw = black, fill = euler#1!20,
minimum size = {(#3-#1+2)*2*(\pgfkeysvalueof{/tikz/euler radius})},
euler node/\pgfinteval{#3-#1+1}/.try = {#1}{#2},
euler node/not 1 = {#1}{#2}}}
\newcommand*\draweuler[2][]{
\foreach[
count=\eulerCnt, /utils/count list={#2}{\eulerTotal},
/tikz/.cd, #1] \eulerTitle in {#2}
\node[euler node={\eulerCnt}{\eulerTitle}{\eulerTotal}]{};}
\begin{document}
\tikz
\matrix[column sep=5mm]{
\draweuler{FIELDS, COMMUTATIVE RINGS, RINGS, GROUPS}
&
\draweuler[euler node/1/.code=]{FIELDS, COMMUTATIVE RINGS, RINGS, GROUPS}
\\};
\end{document}
Output
