Hola.
La respuesta inmediata para ambas preguntas podría ser esta:
void setup()
{
Serial.begin(9600);
char *nombre="Pepito";
char *micadena=retornoCadena(nombre);
Serial.println(micadena);
}
void loop()
{
}
char *retornoCadena(char *cadena1){
char buffer[50]="Hola, ";
strcat(buffer, cadena1);
return(buffer);
}
PEEEEEEEEERO...
Estás devolviendo una cadena de caracteres que se crea en la pila dentro de la función retornoCadena, y que tras regresar de ella puede ser sobrescrita por otras variables, pues se entiende que la función y sus variables ya "han acabado", así que probablemente la cadena devuelta se corrompa con cualquier código posterior a la llamada a la función. Puedes "apartar" memoria desde dentro de la función con calloc(). Es lo que llamamos asignación dinámica de memoria; pero si no la liberas adecuadamente, cada llamada a la función irá acumulando memoria ocupada hasta que llenes toda y... crash. En resumen, opción más compleja que sólo utilizaría si realmente es necesario.
Si no necesitas asignación dinámica (durante la vida del programa sólo va a haber una cadena que luego puedes sobrescribir con los datos nuevos) puedes definir char buffer[tamaño] como variable global; pero entonces no tiene sentido que tu función devuelva el puntero, pues la variable buffer está accesible para todo el programa.
char buffer[50]="Hola, ";
void setup()
{
Serial.begin(9600);
retornoCadena("Pepito");
Serial.println(buffer);
}
void loop()
{
}
void retornoCadena(char *cadena1){
strcat(buffer, cadena1);
}
Una tercera vía que te permitiría llamar a la función y que escriba en distintos buffers, sería enviarle el buffer sobre el que quieres escribir como un parámetro más, es decir en lugar de esperar que la función cree un papel, escriba sobre él y te lo entregue, enviarle tú el papel, que la función lo escriba, y ver cómo quedó el papel 
void setup()
{
char buffera[50]="Hola, ";
char bufferb[50]="adios ";
Serial.begin(9600);
retornoCadena(buffera, "Pepito");
retornoCadena(bufferb, "Juan");
Serial.println(buffera);
Serial.println(bufferb);
}
void loop()
{
}
void retornoCadena(char *cadena, char *cadena1){
strcat(cadena, cadena1);
}
Igual te he liado más que aclarado. Por ello siempre decimos que expongáis vuestras ideas de la forma más detallada posible, y a poder ser con vuestro código, porque se pueden apuntar mejor las respuestas.