Os resultados que você obtém são praticamente os melhores que o CakePHP produz.
Para simplificar isso, você deve usar Set::combine que reindexa sua matriz.
Você precisaria chamar
$data = Set::combine($data, '{n}.0.age', '{n}.0.COUNT(id)');
Isso retornaria uma matriz com idade como o índice e contaria como o valor:
Array
(
[9] => Array
(
[COUNT(id)] => 1
)
[10] => Array
(
[COUNT(id)] => 1
)
...
)
A razão para a profundidade extra na matriz é que o cake usa o modelo como a chave para a matriz interna se você não estiver usando campos calculados, para que você possa colocar vários modelos como campos e eles serão divididos em matrizes diferentes. Quando você usa campos calculados ele mantém a mesma estrutura, mas não conhece o modelo então tem que colocá-lo em um array geral.
Então, digamos que você queira agrupar por masculino/feminino também e tenha um campo User.sex, que não é um campo calculado.
$data = $this->User->find('all', array(
'fields' => array(
"User.sex"
"DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(User.dob, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(User.dob, '00-%m-%d')) AS age",
'COUNT(User.id) AS [count]' // n.b. you have to give aliases normally
),
'group' => 'age', 'User.sex'
));
Isso retornaria (algo como):
Array
(
[0] => Array
(
[User] => Array
(
[sex] => Male
)
[0] => Array
(
[age] => 4
[count] => 1
)
)
[1] => Array
(
[User] => Array
(
[sex] => Female
)
[0] => Array
(
[age] => 10
[count] => 1
)
)
[2] => Array
(
[User] => Array
(
[sex] => Male
)
[0] => Array
(
[age] => 10
[count] => 1
)
)
)
Assim, para consistência, a profundidade extra está sempre presente, mesmo que você use apenas campos calculados