Во втором случае не работает потому что char * сраниваются std::map'ом как указатели. Естественно, две разных строки (одна константа, одна из txePacket), пусть и имея одинаковые значения, находятся по разным адресам и поэтому как указатели не равны.
Остаётся вопрос, почему в первом случае работает. В качестве оптимизации компилятор объединяет все одинаковые строковые константы в одну с одним и тем же адресом в секции только для чтения. Поэтому литеральная строка «foo» в любом месте одной единицы трансляции будет иметь один и тот же адрес.
char *x = "...";
так нельзя. Литеральные строки — это const char *.