Python 2/3, 236 bytes
236 byte version:
n=input();r=len;u=[("",[0]*(n//4))]
while n>r(u[-1][0]):
y,t=u.pop()
for c in 0,1:
s=t[:];u+=(y+"LR"[c],s),
for i in range(r(s)):
if-~r(y)//-~i*-~i==-~r(y):s[i]+=2*c-1;
if abs(s[i])>3:u.pop();break;
print(u[-1][0])
This is fairly fast, for a brute-force-ish method, only taking a few seconds for n=223, but much longer for n>=224.
Explanation: Keep track of a list of string-list pairs (s,u), where the list u is such that u[i] is the current position after following every ith step in the string. For each string in the list, try to add "L" or "R", then change the values in the list that intersect. (i.e. if the resulting string has length 10, add or subtract 1 from positions 1,2,5 and 10, according to the directions you moved). If you exceed 3 or -3 throw the new pair away, otherwise keep it in the list. The longest strings are kept at the end. Once you have a string of length n, return it.