OK. I got it working. Perhaps not quite as simple as I'd hoped, but this function will do the trick ...
function commerce_price_attribute_form_commerce_cart_add_to_cart_form_alter(&$form, $form_state) {
if (isset($form['attributes'])) {
$entity = entity_load_single($form_state['context']['entity_type'], $form_state['context']['entity_id']);
foreach (element_children($form['attributes']) as $field) {
foreach (field_get_items($form_state['context']['entity_type'], $entity, 'field_product') as $product) {
$product = commerce_product_load($product['product_id']);
$status = entity_metadata_wrapper('commerce_product', $product)->status->value();
if ($status) {
$items = field_get_items('commerce_product', $product, $field);
if (is_array($items)) {
$attribute = reset($items);
$attribute = taxonomy_term_load($attribute['tid']);
$items = field_get_items('commerce_product', $product, 'commerce_price');
$item = reset($items);
$price = commerce_currency_format($item['amount'], $item['currency_code'], $product);
$form['attributes'][$field]['#options'][$attribute->tid] = $attribute->name . ' - ' . $price;
}
}
}
}
}
}
Note that the $status value checks whether the variation is disabled and skips over it if it is - without that, disabled products were still showing in the list of options.