Using AJAX in blockform
The issue is not about the form rebuild, the form is being automatically rebuilt on every AJAX call.
The issue here is of the wrapper is not being defined in the '#ajax' array and the wrapper attribute should be given to a "container" type of field and then all of the updated fields should be part of the respective "container" field.

or some ajax command should be called on $response object in the ajax callback method above. 

e.g. 

public function blockForm($form, FormStateInterface $form_state) {

$form['link'] = array(
  '#type' =&gt; 'container',
  '#attributes' =&gt; array('id' =&gt; 'link-wrapper'),
);
for ($i = 0; $i &lt; $this-&gt;configuration['linkNum_submit']; $i += 1) {
    $form['link'][$i] = array(
        '#type'          =&gt; 'textfield',
        '#title'         =&gt; 'Link',
        '#default_value' =&gt; '',
    );
$form['add_link'] = array(
  '#type'     =&gt; 'button',
  '#value'    =&gt; $this-&gt;t('Add link'),
  '#ajax'     =&gt; [
    'callback' =&gt; array($this, 'addLink'),
    'event'    =&gt; 'click',
    'wrapper' =&gt; 'link-wrapper',
    'progress' =&gt; array(
        'type'    =&gt; 'throbber',
        'message' =&gt; t('Adding link...'),
    ),
],


);

and then in the ajax callback

public function addlink(array&amp;$form, FormStateInterface $form_state) {
  return $form['flipper']['front']['settings']['link'];
}