Почему не получается полностью перегрузить оператор =?
Ошибка. Почему?Потому что вы не вызываете оператор присваивания, а совершаете copy-initializtion. Вам может помочь простое правило: все действия совершаемые при объявлении переменной вызывают конструктор.
В первом случае с ошибкой - у оператора присваивания другая сигнатура - там должна быть ссылка. В вашем случае как-то так:
void operator=(const char *& cstr)
Компилятор не находит подходящего оператора присваивания, отсюда ошибка.
Во втором случае - вы сделали подходящий конструктор и компилятор им воспользовался. Но лучше этот конструктор определить как конструктор копирования:
MyExpirementalString(const char *& cstr)