Вы не можете передать большинство типов классов в функцию с переменным числом аргументов - только типы POD (5.2.2, параграф 7 в стандарте);если вы делаете, поведение не определено - что может вызвать проблемы, которые вы получаете.Я уверен, что Arduino String class не является POD, поэтому это не сработает.
Возможно, вам лучше использовать массивы char (по крайней мере, в некоторых местах)например,
String join(char const * const str, ...)
, если это не вызывает уродства на месте вызова или, возможно, просто обеспечивает перегрузки для строк от 1 до N.
Также - может ли когда-либо быть объект Stringравно NULL?Ваш тест на strArg != NULL
выглядит сомнительным.