A word in my defense
as the exercise co-author and track maintainer. The solution here is not “clever” - its SOP for Python strings . But I can see how it would be confounding if you are new to Python and it certainly isn’t obvious. 
Open to suggestions on what might work better in the introduction text/exercise. But I don’t think looping/comprehensions should be moved earlier in the track, nor do I think .join() should be omitted.
This was a very hard exercise to write (I think we went through about 10 iterations for the .join() part), and we really struggled with how we would go over what we considered necessary (+, .join(), indexing, reverse indexing, slicing, splitting, some common sequence operations) WITHOUT resorting to explaining loops or comprehensions.
An earlier version of the exercise did resort to looping, but that was quite awkward as well. In the end, introduction.md was written to include an example of the solution since it is counter-intuitive when folx are primed to think “loop” for these sorts of scenarios:
If a list, tuple, set or other collection of individual strings needs to be combined into a single str, <str>.join(<iterable>), is a better option:
# str.join() makes a new string from the iterables elements.
>>> chickens = ["hen", "egg", "rooster"]
>>> ' '.join(chickens) 'hen egg rooster'
# Any string can be used as the joining element.
>>> ' :: '.join(chickens) 'hen :: egg :: rooster'
>>> ' 🌿 '.join(chickens) 'hen 🌿 egg 🌿 rooster'
We finally settled on the current version in the hope that most students would follow the example in the intro & that would eventually help them understand that many many functions/methods/constructors in Python either iterate themselves, or return iterators - so the go-to for iteration is not always setting up a formal loop construct (and it is definitely NOT to set up an independent loop counter!!).
.join() is (allegedly) faster than the equivalent loop using += in almost every circumstance (here is an older SO post that has some detail and some insight on the confusion). Once you understand how it works, it is also more readable and less verbose than a loop.
Since I couldn’t find any specific stats against Python 3.11.5, I will leave it to you to play with timeit, if you are inclined. But beware of the details of the SO post: some of the core Python devs optimized certain += cases, but not all and not … reliably. 
It is all a bit … sticky, since the mechanics of how .join() works are quite a bit more complicated than your average loop. So we didn’t want to go into deep detail on .join() - we wanted to show an example that students could copy and have success with early in their journey.