Невозможно избежать создания объекта, потому что оператор [] не знает, как его использовать.
myMap["apple"] = "green";
или
char const * cColor = myMyp["apple"];
Я предлагаю, чтобы контейнер карты добавлял функцию, подобную
if( ! myMap.exist( "apple"))
throw ...
, ее намного проще и лучше читать, чем
if( myMap.find( "apple") != myMap.end())
throw ...