Why is my form_state being reset after submission?
The issue was in the callback frunction my_action(). I was using the ctools_modal_form_render() function wrong. In the end I replaced the call to ctools_modal_form_render() with ctools_modal_form_wrapper():

function my_action($js = NULL, $nid = NULL) {
  if(!$js) {
    $form_state = array( 'nid' =&gt; $nid );
    return drupal_build_form('my_action_form', $form_state);
  }
  ctools_include('modal');
  ctools_include('ajax');
  $form_state = array(
    'title' =&gt; t('My Action Form'),
    'ajax' =&gt; TRUE,
    'nid' =&gt; $nid
  );
  $output = ctools_modal_form_wrapper('my_action_form', $form_state);
  if ( !empty($form_state['executed']) ) {
    $output = array();
    $output[] = ctools_modal_command_dismiss();
  }
  print ajax_render($output);
  exit;
}