I think it's not possible to change drawing color in the middle of path:
But for this particular case, clipping could be a valid option. Even the black dot on (0,0) helps to hide a bad join between clipped parts.
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{hobby,decorations.markings}
\begin{document}
\begin{tikzpicture}[use Hobby shortcut]
% middle crossing loop
% \draw (3,-1) .. (2,0) .. (0,0.93) .. (-0.93,0) .. (0,-0.93) .. (2,0) .. (3,1);
\begin{scope}
\clip (3,-1) rectangle (2,1);
\draw[thick, blue, fill=blue!30] (3,-1) .. (2,0) .. (0,0.93) .. (-0.93,0) .. (0,-0.93) .. (2,0) .. (3,1);
\end{scope}
\begin{scope}
\clip (2,1) rectangle (-1,-1);
\draw[thick, red, fill=red!30] (3,-1) .. (2,0) .. (0,0.93) .. (-0.93,0) .. (0,-0.93) .. (2,0) .. (3,1);
\end{scope}
% filled points
\fill (0,0) circle (1pt);
\fill (2,0) circle (1pt);
\end{tikzpicture}
\end{document}

If you want to draw arrows over any path can use decoration.markings library. Answers to TikZ: How to draw an arrow in the middle of the line? are good examples.
\documentclass[border=3mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{hobby,decorations.markings, arrows.meta,bending}
\begin{document}
\begin{tikzpicture}[use Hobby shortcut,
decoration={markings,
mark=between positions 0 and 1 step 2mm with
{\arrow{Stealth[length=1mm,flex]}},
}]
\begin{scope}
\clip (3,-1) rectangle (2,1);
\draw[thick, blue, fill=blue!30, postaction={decorate}] (3,-1) .. (2,0) .. (0,0.93) .. (-0.93,0) .. (0,-0.93) .. (2,0) .. (3,1);
\end{scope}
\begin{scope}
\clip (2,1) rectangle (-1,-1);
\draw[thick, red, fill=red!30, postaction={decorate}] (3,-1) .. (2,0) .. (0,0.93) .. (-0.93,0) .. (0,-0.93) .. (2,0) .. (3,1);
\end{scope}
% filled points
\fill (0,0) circle (1pt);
\fill (2,0) circle (1pt);
\end{tikzpicture}
\end{document}
