I guess, if you strictly want to avoid for loops, the easiest way is converting to a list, replacing items, and then converting back.
This would be:
s = "0123456789012345689"
lst = list(s) # result: ['0', '1', '2', ..., '9']
lst[0:-1:5] = ["x"]*len(lst[0:-1:5])
Result then is:
In [43]: lst
Out[43]:
['x',
'1',
'2',
'3',
'4',
'x',
'6',
'7',
'8',
'9',
'x',
'1',
'2',
'3',
'4',
'x',
'6',
'8',
'9']
For getting it back to string you would simply use a join:
In [44]: "".join(lst)
Out[44]: 'x1234x6789x1234x689
The part lst[0:-1:5] select every 5th element in the list, beginning with the very first entry, denonted by 0:. If you want it to start at the 5th element, then simply do lst[5:-1:5]. The -1 part means "until the end", the last :5 stands for "every fifth".
Assigning values with ["x"]*len(lst[0:-1:5]) is needed, since "x" here would try to assign a single value to a slice of the original list with the length len(lst[0:-1:5]), because this is exactly how many items we selected in the first place.
EDIT:
Giving it a second look the expected outcome is actually to change every 6th character, not every 5th (while preserving 5 characters in between the changed ones from the original string).
One would then, of course, need to adjust the slicing to select every 6th character:
lst[5:-1:6] = ["x"]*len(lst[5:-1:6])
^ ^
Result:
In [12]: "".join(lst)
Out[12]: '01234x67890x23456x9'
Every sixth character now is being replaced, while preserving the 5 ones in between from the original string.