Не создается там объект строки с именем "o".
Создается объект строки со свойством у которого значение равно "o".
String {0: "о", length: 1, [[PrimitiveValue]]: "о"}
При вызове метода, this будет равен этому объекту. А так как метод join должен принимать строковое значение, то this преобразуется в строковое значение "o" при помощи метода toString();