Table doesn't render on ajax command
I think the problem was not specifying an id attribute for my table when I first render it, so there was nothing to replace. 

This seems to work:

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state, $job_id=NULL) {
    $jobs = $this-&gt;_query("
      select *
      from Active_Job_List;
    ");

    $formatted_jobs = [];
    $len = count($jobs);
    for($i=0; $i&lt;$len; $i++){
      $formatted_jobs[$jobs[$i]['Job_ID']] = $jobs[$i]['Job_Name'];
    }
    natsort($formatted_jobs);

    $form['job_id'] = [
      '#weight' =&gt; 1,
      '#title' =&gt; t('Job'),
      '#type' =&gt; 'select',
      '#options' =&gt; $formatted_jobs,
      '#ajax' =&gt; [
        'callback' =&gt; '::showFiles',
        'wrapper' =&gt; 'ajax-wrapper'
      ],
      '#required' =&gt; TRUE,
      '#default_value' =&gt; $job_id
    ];

    $form['jobfiles'] = $this-&gt;_files_table($job_id);
    $form['jobfiles']['#weight'] = 2;

    if($job_id != null){
      $form['newfile'] =  [
        '#weight' =&gt; 3,
        '#title' =&gt; t('Upload new file'),
        '#type' =&gt; 'link',
        '#url' =&gt; Url::fromRoute('JobFileUpload.UploadForm', ['job_id' =&gt; $job_id]),
        '#attributes' =&gt; [
          'id' =&gt; ['new-file']
        ]
      ];
    }

    return $form;
  }

  public function showFiles(array &amp;$form, FormStateInterface $form_state) {
    $job_id = $form_state-&gt;getValue('job_id');
    // $form_state-&gt;setRedirectUrl(Url::fromRoute('JobFileUpload.OverviewWithJobId', ['job_id' =&gt; $job_id]));

    $table = $this-&gt;_files_table((int)$job_id);
    $link = [
      '#type' =&gt; 'markup',
      '#markup' =&gt; new FormattableMarkup('&lt;a href=":link"&gt;Upload a new file...&lt;/a&gt;', [':link' =&gt; (Url::fromRoute('JobFileUpload.UploadForm', ['job_id' =&gt; $job_id]))-&gt;toString()
      ])
    ];
    $renderer = \Drupal::service('renderer');

    $response = new AjaxResponse();
    $response-&gt;addCommand(new HtmlCommand('#ajax-wrapper', $renderer-&gt;render($table)));
    $response-&gt;addCommand(new HtmlCommand('#new-file', $renderer-&gt;render($link)));

    return $response;  
  }