JavaScript toggle form elements
That's not a toggle

Toggle has a very specific meaning and comes with the benefit of not having to supply the new state when called. Your function is not a toggle and should be called something along the lines of  setFormDisableState(formElements, disable = true) or setFormState(formElements, disable)

Argument order

If not using a default parameter use the right to left assignment rule when defining argument order. Eg assignment is right to left for a = b. Your function is assigning a state to elements in the object elArr, the elArr should be to the left of the toggle.

Danger! implied type

elArr is not an array. That is most defiantly a bad name as it implies the incorrect type.

The shortest form.

For all attributes defined in the DOM set the values directly. You only use the attribute functions for attributes not defined by the DOM. Using the longer version to do anything in code adds unneeded noise.

Keep the source DRY

Don't Repeat Yourself (code). The field iterators elArr.fields.forEach are almost identical, with only the state changing.

You have two if statements. You don't need to do the second test. If not disabling then must be enabling.


Alternatives
function toggleFormState(formDesc) { // Desc is short for description
  const newState = ! formDesc.btn.disabled;  
  formDesc.btn.innerHTML = newState ? '&lt;i class=&quot;fas fa-spinner fa-spin&quot;&gt;&lt;/i&gt;' : &quot;Submit&quot;;
  formDesc.btn.disabled = newState;
  for (const element of formDesc.fields) { element.disabled = newState }
}

Or
function setFormState(formDesc, disable) { 
  formDesc.btn.innerHTML = disable ? '&lt;i class=&quot;fas fa-spinner fa-spin&quot;&gt;&lt;/i&gt;' : &quot;Submit&quot;;
  formDesc.btn.disabled = disable;
  for (const element of formDesc.fields) { element.disabled = disable }
}