Does an ajax callback work within a Views style plugin?
From what I understand seeing the AJAX docs, I think you're not supposed to return an AjaxResponse object. You're supposed to return a renderable array from the Ajax callback.

Sample Code

public function buildOptionsForm(&amp;$form, FormStateInterface $form_state) {
  parent::buildOptionsForm($form, $form_state);
  $form['test'] = [
    '#title' =&gt; t('TEST!'),
    '#type' =&gt; 'select',
    '#options' =&gt; [
      '' =&gt; t('None'),
      'foo' =&gt; t('Bar'),
    ],
    '#ajax' =&gt; [
      'event' =&gt; 'change',
      'wrapper' =&gt; 'ajax-output-container',
      // Since views style options forms are complex, they're built by
      // Drupal in a different way. To bypass this problem we need to
      // provide the full path to the Ajax callback.
      'callback' =&gt; __CLASS__ . '::testCallback',
    ],
    '#prefix' =&gt; '&lt;div id="ajax-output-container"&gt;&lt;/div&gt;',
    '#default_value' =&gt; '',
  ];
}

/**
 * This is the AJAX callback.
 *
 * It generates the output for the AJAX request. The output REPLACES
 * the "wrapper" you define in #ajax.
 */
public function testCallback(array $form, FormStateInterface $form_state) {
  // This element will replace the DIV#foo you have in your #prefix.
  $elem = [
    '#type' =&gt; 'markup',
    '#markup' =&gt; '&lt;div id="ajax-output-container"&gt;Is it not working!&gt;&lt;/div&gt;',
  ];
  return $elem;
}


Debugging


Make sure that on page load, you're getting a div with the correct ID in your field prefix. You can put some default text in the prefix so that you can see it on page load?
If HTML tags are being stripped from your #prefix markup for some reason, then try injecting a separate item in the form with #markup.