Parsing and comparing strings on Arduino: different behaviour from gcc?
Both versions of your code have undefined behavior. On the given input your code will call strtok three times and store its result into the array three times: for the first token, for the second token and, finally, for the null pointer. You store all three (including that null pointer!) into the all_tokens array, which has size 2. 

You are obviously aware of the potential array overrun danger: you even wrote this comment in your code

char *all_tokens[2]; //NOTE: the message is composed by 2 tokens: command and value


and yet in the following cycle 

int i = 0;

all_tokens[i] = strtok(rcv_msg, "{, }");
while (all_tokens[i] != NULL) {
    all_tokens[++i] = strtok(NULL, "{, }");
}


you still insist on storing more than two values into all_tokens array.



Also, the second version of your code uses completely different message key values (why is it suddenly "motor1_pattern1" instead of "message_1"?), which makes it unclear how you compared the functionality of the second version with the functionality of the first.