Probably you should, as said by @js bibra, use relative coordinates and position MOSes using some reference anchor, but I prepared an answer using (almost) your example, to show how to use anchors to do connections.
You should basically give a name to your nodes, using the node[](my node name)
syntax, and then you have all the anchors available under the syntax (my node name.anchor)
. You can find all the available anchors in the manual.
\documentclass[border=10pt]{standalone}
\usepackage[siunitx, RPvoltages]{circuitikz}
\begin{document}
\begin{tikzpicture}[]
\ctikzset{transistors/thickness=4}
\ctikzset{tripoles/mos style=arrows}
\ctikzset{transistors/arrow pos=end}
% name the MOSes. The text is optional, show the use of the \ctikzflip_ macros
% relative positioning would be better to be able to "move" and "replicate"
% the block as a whole
\draw (0,-2) node[pmos,nocircle](M1){M1};
\draw (2,-2) node[pmos,nocircle,xscale=-1](M2){\ctikzflipx{M2}};
\draw (2,-4) node[nmos,xscale=-1](M3){\ctikzflipx{M3}};
\draw (1,-6) node[nmos](M4){M4} (1,-7) (M4.S) node[ground]{};
% use anchors --- they are a fundamental part of TikZ!
\draw (M1.S) -- (M2.S);
\draw (M2.D) -- (M3.D);
\draw (M1.D) |- (M3.S); % first vertically, the horizontally
\draw (M4.D) -- (M4.D |- M3.S); % coordinate with M4.D vertical and M3.S horizontal
% extra example: find the midpoint between two coords
\draw ($(M2.D)!0.5!(M3.D)$) -- ++(2,0) to[C] ++(0,-2) node[ground]{};
\end{tikzpicture}
\end{document}

anchor =source
needs to be added to thefet
for proper alignment with the pins