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.