Обе строки пусты при создании, они не содержат символов. f[0]
выходит за пределы, и доступ к любому элементу пустого контейнера является неопределенным поведением, поэтому все может быть законно.
Вам нужно сделать
string f(1, 'd'), s; // creates f with 1 repetition of 'd'
s.append(f);
...
Или
string f, s;
f += 'd'; // or f.push_back('d'), or f.append('d'), or...
s.append(f);
...