Eu nunca vi esse problema. Esse valor padrão deve funcionar. Eu diria que tente fazer da chave uma string e definir #default_valuecomo uma string. A #optionsmatriz pode estar sendo passada por array_merge algum lugar, reaplicando chaves inteiras. Se chaves são strings, isso não deve acontecer. Atualmente, sua matriz fica assim:
$options = array(
0 => '0',
500 => '500',
1000 => '1000',
);
Mas passar essa matriz array_mergepode reorganizar essas chaves inteiras para estar em ordem seqüencial:
$options = array(
0 => '0',
1 => '500',
2 => '1000',
);
Se isso acontecer, a 500chave simplesmente não existe. Isso ocorre porque array_mergenão gosta de preservar chaves inteiras, mas você pode usar cadeias de caracteres para evitá-lo. Então, acho que sua matriz deve se parecer mais com isso:
$options = array(
'0' => '0',
'500' => '500',
'1000' => '1000',
);
Então você pode definir o seu #default_value:
$form['price']['min']['#default_value'] = '500';
Caso contrário, existe algum outro lugar em que o default_valueitem possa estar sendo substituído?