どの辺が気持ちわるいのか分かりませんが、動作を変えずに細部を少し見やすく書き直してみました。

import subprocess;
import re;

re_interface = re.compile('インターフェイス: ([0-9.a-f-]+) --- (.*)')
re_item = re.compile('\s+([0-9.]+)\s+([0-9.a-f-]+)\s+([^\s]+(?:\s+[^\s]+)*)\s*')
arp_res = subprocess.run(['arp', '-a'], stdout=subprocess.PIPE)

interfaces = {}
interface = None

for line in arp_res.stdout.decode('cp932').splitlines():
  m = re_interface.fullmatch(line)
  if m:
    interfaces[m.group(1)] = interface = {
      'ip_addr': m.group(1),
      'id': m.group(2),
      'items': [],
    }
  if interface:
    m = re_item.fullmatch(line)
    if m:
      interface['items'].append({
        'ip_addr': m.group(1),
        'mac_addr': m.group(2),
        'type': m.group(3),
      })

print(interfaces)