Почему массив заполнился буквой H?
Память не инициализирована, поэтому там мусор. Что именно -- Unspecified Behavior.
Вообще это довольно странно, никакого unspecified behavior происходить не должно, так как выражение new вызывает конструктор по умолчанию для каждого объекта, то есть встроенные типы должны быть инициализированы нулём.
Попробуйте вывести не символ, а его код, заменив одну строчку на:cout << static_cast<int>(arr[i][z]) << endl;P. S.  Несколько советов по коду. Во-первых, после директив препроцессора не нужно ставить точку с запятой:#include <iostream>
Во-вторых, endl не только переводит на новую строку, но и сбрасывает накопленный буфер, то есть сразу выводит всё на экран или в файл. Если у вас много вывода, это может очень серьёзно замедлить вашу программу. Для простого перевода строки выводите специальный управляющий символ '\n'
Если выводите матрицу (двумерный массив), удобнее делать это так:for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        cout << arr[i][j] << ' '; // пробел можно убрать
    }
    cout << '\n';
}
Так же никогда не нужно использовать функцию system. Она приостанавливает вашу программу, и запускает другую (в данном случае pause). Такой вариант не только не оптимальный, но ещё и платформозависимый. Людям, которые используют mac или linux придётся вносить изменения в ваш код, чтоб запустить его, так как в этих ОС нет команды pause. Используйте для этого средства языка C++: cin.get();
И ещё никогда не используйте заголовочный файл conio.h. Он не является частью стандарта языков C или C++, и не поддерживается большинством компиляторов.P. P. S. Какой компилятор вы используете? Какой он версии? Какие ключи компиляции или настройки проекта в IDE?