Initially, I took the anticlockwise desideratum seriously. From your mock-up, I'm no longer sure it is what you want, so here's an alternative. The original is below.
Updated Parameterised Answer Following Mock-Up
If you really want to go anticlockwise, that will sometimes mean drawing an arc through 359 degrees. This is true even if the line always passes through a white node. The closest route to the closest black node if exiting the white node at 240, for example, is clockwise to 3 and not anticlockwise to 4. I'm not sure if that is what you really want as it seems strange. Below, I've taken the shortest route, but I don't know if that is correct.
This is, of course, the trouble with trying to draw something which represents I-know-not-what. How-it-should-go is probably obvious to you, but entirely obscure to me!
\documentclass[tikz,border=10pt,multi]{standalone}
\usetikzlibrary{arrows.meta}
\begin{document}
% ateb i gwestiwn Richard: http://tex.stackexchange.com/q/315559/
\begin{tikzpicture}
[
scale=0.7,
rotate=90,
>=Triangle,
outer radius/.store in=\oradius,
middle radius/.store in=\mradius,
inner radius/.store in=\iradius,
outer no/.store in=\ono,
middle no/.store in=\mno,
inner no/.store in=\ino,
outer number/.store in=\onumber,
middle number/.store in=\mnumber,
inner number/.store in=\inumber,
outer n/.code={%
\pgfmathsetmacro\tno{int(#1-1)}
\tikzset{%
outer no/.expanded=\tno,
outer number=#1,
}
},
middle n/.code={%
\pgfmathsetmacro\tno{int(#1-1)}
\tikzset{%
middle no/.expanded=\tno,
middle number=#1,
}
},
inner n/.code={%
\pgfmathsetmacro\tno{int(#1-1)}
\tikzset{%
inner no/.expanded=\tno,
inner number=#1,
}
},
outer radius=5,
middle radius=3,
inner radius=1,
outer n=12,
middle n=7,
inner n=3,
]
% outer circle
\draw (0,0) circle (\oradius);
\foreach \i in {0,...,\ono}
{
\node (o\i) [draw, fill=gray!30, circle] at (-{\i*360/\onumber}:\oradius) {\i};
}
% middle circle
\draw (0,0) circle (\mradius);
\foreach \s in {0,...,\mno}
{
\node (m\s) [draw, fill=black, circle] at ({360*\s/\mnumber}:\mradius) {};
}
% inner circle
\draw (0,0) circle (\iradius);
\foreach \s in {0,...,\ino}
{
\node (i\s) [draw, fill=white, circle] at ({360*\s/\inumber}:\iradius) {};
}
% \foreach \i in {0,...,\ono} \node [font=\tiny, red] at (o\i) {o\i};
% \foreach \i in {0,...,\mno} \node [font=\tiny, red] at (m\i) {m\i};
% \foreach \i in {0,...,\ino} \node [font=\tiny, red] at (i\i) {i\i};
% arrow
\draw[->] (0,0) -- ({\oradius+1},0);
\foreach \i in {0,120,240}
{
\pgfmathsetmacro\n{int(round(\i*\mnumber/360))}
\pgfmathsetmacro\m{int(round((\n*360/\mnumber)*\onumber/360))}
\draw [->, magenta] (0,0) -- (\i:{(\iradius+\mradius)/2}) arc (\i:{\n*360/\mnumber}:{(\iradius+\mradius)/2}) -- ({\n*360/\mnumber}:{(\oradius+\mradius)/2}) arc ({\n*360/\mnumber}:{\m*360/\onumber}:{(\oradius+\mradius)/2}) -- ({\m*360/\onumber}:{\oradius+1});
}
\end{tikzpicture}
\end{document}

Original Answer
Do you want something like this? Applying your algorithm obviously results in a different exit node in some cases because 3 is closer to the closest black node than is 4, even though 4 is obviously closer to the original direction.

Here's the code for the one-off version shown:
\documentclass[tikz,border=10pt,multi]{standalone}
\usetikzlibrary{arrows.meta}
\begin{document}
\begin{tikzpicture}[scale=0.7, rotate=90, >=Triangle]
% outer circle
\def \radius {5}
\draw (0,0) circle (5);
\foreach \angle / \label in {0/0, 30/11, 60/10, 90/9, 120/8, 150/7, 180/6, 210/5, 240/4, 270/3, 300/2, 330/1}
{
\node (o\label) [draw,fill=gray!30,circle] at (\angle:\radius) {\label};
}
% middle circle
\def \n {6}
\def \radius {3}
\draw (0,0) circle (\radius);
\foreach \s in {0,...,\n}
{
\node (m\s) [draw,fill=black,circle] at ({360*\s/(\n+1)}:\radius) {};
}
% inner circle
\def \n {2}
\def \radius {1}
\draw (0,0) circle (\radius);
\foreach \s in {0,...,\n}
{
\node (i\s) [draw,fill=white,circle] at ({360*\s/(\n+1)}:\radius) {};
}
% \foreach \i in {0,...,11} \node [font=\tiny, red] at (o\i) {o\i};
% \foreach \i in {0,...,6} \node [font=\tiny, red] at (m\i) {m\i};
% \foreach \i in {0,...,2} \node [font=\tiny, red] at (i\i) {i\i};
% arrow
\draw[->] (0,0) -- (6,0);
\pgfmathsetmacro\n{int(round(240*7/360))}
\pgfmathsetmacro\m{int(round((\n*360/7)*12/360))}
\draw [->] (0,0) -- (240:2) [out=180+240,in=180+\n*360/7] to ({\n*360/7}:2) -- ({\n*360/7}:4) [out=180+\n*360/7,in=180+\m*360/12] to ({\m*360/12}:4) -- ({\m*360/12}:6);
\end{tikzpicture}
\end{document}
Parameterised Version
Here's a parameterised version:
\documentclass[tikz,border=10pt,multi]{standalone}
\usetikzlibrary{arrows.meta}
\begin{document}
% ateb i gwestiwn Richard: http://tex.stackexchange.com/q/315559/
\begin{tikzpicture}
[
scale=0.7,
rotate=90,
>=Triangle,
outer radius/.store in=\oradius,
middle radius/.store in=\mradius,
inner radius/.store in=\iradius,
outer no/.store in=\ono,
middle no/.store in=\mno,
inner no/.store in=\ino,
outer number/.store in=\onumber,
middle number/.store in=\mnumber,
inner number/.store in=\inumber,
outer n/.code={%
\pgfmathsetmacro\tno{int(#1-1)}
\tikzset{%
outer no/.expanded=\tno,
outer number=#1,
}
},
middle n/.code={%
\pgfmathsetmacro\tno{int(#1-1)}
\tikzset{%
middle no/.expanded=\tno,
middle number=#1,
}
},
inner n/.code={%
\pgfmathsetmacro\tno{int(#1-1)}
\tikzset{%
inner no/.expanded=\tno,
inner number=#1,
}
},
outer radius=5,
middle radius=3,
inner radius=1,
outer n=12,
middle n=7,
inner n=3,
]
% outer circle
\draw (0,0) circle (\oradius);
\foreach \i in {0,...,\ono}
{
\node (o\i) [draw, fill=gray!30, circle] at (-{\i*360/\onumber}:\oradius) {\i};
}
% middle circle
\draw (0,0) circle (\mradius);
\foreach \s in {0,...,\mno}
{
\node (m\s) [draw, fill=black, circle] at ({360*\s/\mnumber}:\mradius) {};
}
% inner circle
\draw (0,0) circle (\iradius);
\foreach \s in {0,...,\ino}
{
\node (i\s) [draw, fill=white, circle] at ({360*\s/\inumber}:\iradius) {};
}
% \foreach \i in {0,...,\ono} \node [font=\tiny, red] at (o\i) {o\i};
% \foreach \i in {0,...,\mno} \node [font=\tiny, red] at (m\i) {m\i};
% \foreach \i in {0,...,\ino} \node [font=\tiny, red] at (i\i) {i\i};
% arrow
\draw[->] (0,0) -- ({\oradius+1},0);
\foreach \j [evaluate=\j as \i using (\j*360/\mnumber)+20] in {0,...,\mno}
{
\pgfmathsetmacro\n{int(round(\i*\mnumber/360))}
\pgfmathsetmacro\m{int(round((\n*360/\mnumber)*\onumber/360))}
\draw [->, blue] (0,0) -- (\i:{(\iradius+\mradius)/2}) [out=180+\i,in=180+\n*360/\mnumber] to ({\n*360/\mnumber}:{(\iradius+\mradius)/2}) -- ({\n*360/\mnumber}:{(\oradius+\mradius)/2}) [out=180+\n*360/\mnumber,in=180+\m*360/\onumber] to ({\m*360/\onumber}:{(\oradius+\mradius)/2}) -- ({\m*360/\onumber}:{\oradius+1});
}
\end{tikzpicture}
\end{document}
