I compiled your code to 3606 bytes using the String object. Getting rid of those Strings and using a C string instead:
byte wibble[2] = {15, 10}; // FA hex. In reality these are populated from the wifi MAC.
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println();
method3();
}
void method3() { // successfully creates "node_fa"
char wifi_pass_start[10] = "node_";
char c[5];
itoa(wibble[0], c, HEX);
strcat(wifi_pass_start, c);
itoa(wibble[1], c, HEX);
strcat(wifi_pass_start, c);
Serial.print("Method3: "); Serial.println(wifi_pass_start);
}
void loop() {
// put your main code here, to run repeatedly:
}
drops the code size to 2164 bytes. While the String class has a lot of power, many programs don't use all of that power, resulting in code size that's bigger than it needs to be.