You can use a select list with a pre-loaded option list. In that "preload" callback you can alter available options.
Define a custom option list:
function mymodule_webform_select_options_info() {
$items = array();
$items['exclusive'] = array(
'title' => t('Exclusive options'),
'options callback' => 'mymodule_webform_options_exclusive',
);
return $items;
}
This callback is called every time the form is displayed, we can alter options here based on previous submissions:
function mymodule_webform_options_exclusive() {
$default_options = array("One" => 1, "Two" => 2, "Three" => 3);
$available_values = mymodule_webform_available_values(5); // nid of the webform
return array_diff($default_options, $available_values);
}
function mymodule_webform_available_values($nid) {
$submissions = webform_get_submissions(array("nid" => $nid));
// get all the options values that were already submitted
$values = array_values(array_map(function($submission) {
return $submission->data[1][0]; // 1 == index of the field in the form
}, $submissions));
return $values;
}
Two things are hard-coded here: nid of the webform (5 here) and the index of the select widget (1 here). It might be possible to avoid hard-coding stuff, good luck!