DataBinder.Eval сначала разбивает строку по частям выражения через набор массивов токенов (который он определяет в статическом конструкторе как):
expressionPartSeparator = new char[] { '.' };
Затем эти части передаются в закрытый метод Eval, который будет использовать DataBinder.GetPropertyValue или DataBinder.GetIndexedPropertyValue по мере необходимости для дальнейшего определения значения выражения.
Чтобы обойти это, просто используйте GetIndexedPropertyValue напрямую со своим строковым выражением, например:
Console.WriteLine(DataBinder.GetIndexedPropertyValue(blah, "dict[a.aa]" ));
Также обратите внимание, что вам не нужны дополнительные кавычки ... они излишни.