hook_form_alter() Ajax suffix replace
I think the estrange behaviour it's because the suffix is after and not inside the wrapper, thus not get replaced and since you're ajaxly returning $form['field_job_description']; which contains the wrapper; thus, you end up with two same ID wrappers and fails on the second run.
Move the link generation to a function.
Here is an alternative AJAX approach where we target the link wrapper rather than the form wrapper.
function my_dashboard_form_alter(&amp;$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id){
  if($form_id == 'node_job_listing_owner_job_form_form'){
    $link = _my_dashboard_get_term_link($form, $form_state);
    $form['field_job_description']['#suffix'] = '&lt;div class=&quot;term-link&quot;&gt;' . $link . '&lt;/div&gt;'; // wrap link
    $form['field_job_description']['widget']['#ajax'] = [ // removed 'wrapper' =&gt;
      'callback' =&gt; 'updateJobDescriptionPreviewLink',
      'event' =&gt; 'change',
    ];
  }
}

function updateJobDescriptionPreviewLink(&amp;$form, \Drupal\Core\Form\FormStateInterface $form_state){
  $link = _my_dashboard_get_term_link($form, $form_state);
  $response = new \Drupal\Core\Ajax\AjaxResponse();
  $response-&gt;addCommand(new \Drupal\Core\Ajax\HtmlCommand(&quot;.term-link&quot;, $link));
  return $response;
}

function _my_dashboard_get_term_link(&amp;$form, \Drupal\Core\Form\FormStateInterface $form_state) {
  $tid = $form_state-&gt;getValue('field_job_description')[0]['target_id'];
  if(empty($tid)){
    $tid = $form['field_job_description']['widget']['#default_value'][0];
  }
  $link = null;
  if(!empty($tid)){
    $link_url = \Drupal\Core\Url::fromRoute('entity.taxonomy_term.canonical', [
      'taxonomy_term' =&gt; $tid
    ], [
      'attributes' =&gt; [
        'class' =&gt; ['use-ajax'],
        'data-dialog-type' =&gt; 'dialog',
        'data-dialog-options' =&gt; \Drupal\Component\Serialization\Json::encode(['width' =&gt; 420]),
        'data-dialog-renderer' =&gt; 'off_canvas',
      ],
    ]);
    $link = \Drupal::l('Preview Job Description...'.$tid, $link_url);
    return $link;
  }
}