C (gcc), 132 128128 126 bytes
char*k;g(a,b,i,r)char**a,**b;{r=k[i%strlen(k)];(r^(i[*a]?:-1))-(r^(i[*b]?:-2))?:g(a,b,i+1);}f(c,v)char**v;int*v;{k=*v;qsort(v,c,8,g);} Takes an argument count and a pointer to a string array (the key, followed by the strings to be sorted) and modifies the string array in-place.
The code is highly non-portable and requires 64-bit pointers, gcc, and glibc.
Try it online!Thanks to @ceilingcat for golfing off 2 bytes!