Я не знаю, есть ли кросс-браузерное решение. Блочная модель IE на самом деле работает так, как вам хотелось бы: как только вы объявляете ширину элемента, это ширина, а затем она вычитает из «внутренней» ширины элемента отступ и границу заполнения, чтобы дать вам объявленную ширину.
Все остальные браузеры делают противоположное: они устанавливают ширину элемента на объявленную ширину, а затем добавляют отступы полей и рамку.
Я только что проверил ваш код в IE7 и Firefox 3.5, и оба имеют ширину 500px даже с черной рамкой 10px. Я бы побеспокоился о старых версиях Firefox.