'pgfmathresult' uses the argument for 'text opacity'

The issue is that \pgfmathresult gets overwritten, so you may want to use \pgfmathsetmacro instead to store the result of the computation in a macro. (I also got rid of xifthen because it is not needed for integer comparisons, for which you can use a simple \ifnum.)

          every label/.style={inner sep=0pt, opacity=0.8, text opacity=1.0, fill=white},
          cnode/.style={draw=black,fill=#1,minimum width=3mm,circle},
        \node[cnode=red,label=0:{$\hat y_1$}] (s1) at (6,-1) {};
        \node[cnode=red,label=0:{$\hat y_2$}] (s2) at (6,-2) {};
        \node at (6,-3) {$\vdots$};
        \node[cnode=red,label=0:{$\hat y_K$}] (sK) at (6,-4) {};

        \foreach \x in {0,...,4}
            \pgfmathsetmacro{\myindex}{\x<4 ? \x : "q-1"}
                \node[cnode=gray,label={90:$z_{\myindex}$}] (h-\x) at (3,{-\x-div(\x,4)+.5}) {};
                 \node[cnode=gray,label=90:$1$] (h-0) at (3,0.5) {};
            \begin{scope}[on background layer]
              \draw (h-\x) --  (s1);
            \draw (h-\x) -- (s2);
            \draw (h-\x) --  (sK);

        \node at (3,-3.5) {$\vdots$};

        \node[cnode=gray,label=90:$z_{M}$] (h-q) at (3,-5.5) {};
        \begin{scope}[on background layer]
        \draw (h-q) --  (s1);
        \draw (h-q) -- (s2);
        \draw (h-q) --  (sK);

enter image description here