Как получить доступ к символам элемента массива?
У вас элементы основного массива тоже являются массивами. Вот вам и выдаёт ошибку, что в массиве нет элемента с индексом 4. А при замену фигурных скобок на квадратные - это пока только предупреждение.
$x = [0 => ['#ff069f'], 1 => ['#FF5500'], 2 => ['#009900']];
echo $x[1][0][4];
// 5
И это обращение не к символу, а к байту, что не всегда одно и то же.
$x = "Привет!";
echo $x[0];
// �
$x = [0 => ['#ff069f'], 1 => ['#FF5500'], 2 => ['#009900']];
print($x[1][0][4]);
В вашем примере каждому ключу массива соответствует не строка, а массив, поэтому сначала нужно получить нулевой элемент соответствующего массива, а затем уже определенный символ из этой строки.

И учитывайте важное уточнение от Rsa97 насчет байтов и символов. В случае с цветами проблемы не будет, но для кириллицы возникнет. Универсальным вариантом для разбития строки на массив символов будет использование функции mb_str_split
$x = [0 => ['#ff069f'], 1 => ['#FF5500'], 2 => ['#009900']];
print_r(mb_str_split($x[1][0])[4]);