How to change checkboxes options with ajax callback
I think the problem is simply a matter of the order the functions are run in.

The AJAX callback will run after the form has been built. So even though you're adding the new item to the database, the code to build the checkbox options (from $user_hardware = _get_users_hardware($user); downwards) has already run. Since it's already run, the new DB item won't be shown until the next time the page is loaded.

If that is the problem the fix would be as simple as adding a bit of code to the end of your _update_hardware() function, to populate the new options:

// ...

// Insert the hardware in to the database...
db_insert('waiver_hardware')-&gt;fields(array(
  'user_id' =&gt; $user-&gt;uid,
  'date_added' =&gt; REQUEST_TIME,
  'hardware_type' =&gt; $hardware_type,
  'manufacturer' =&gt; $manufacturer,
))-&gt;execute();

$hardware_options = array();
foreach($user_hardware as $h)  {
  $hardware_options[$h['hid']] = $h['hardware_type'] . ' (' . $h['manufacturer'] . ') ' . 'S/N: ' . $h['serial_number'] . ', Last Seen: ' . date('D, n/d/Y g:i a', $h['last_seen']);
}

$form['user_info_div']['selected_hardware_checkboxes']['#options'] = $hardware_options;

return $form['user_info_div'];