Custom node migration for multi-value imagefield
I think your problem come from source migrate. When you using process sub_process source data must be an array like this:

[
    'fid' =&gt; 1,
    'another_key' =&gt; '...'
],
[
    'fid' =&gt; 2,
    'another_key' =&gt; '...'
],
[
    'fid' =&gt; 23,
    'another_key' =&gt; '...'
]


Note: fid is old fid of database need to migrate.

I'll show you a example migrate field image with multilple value. I have a content type with machine name galary. This content type have body and field images (machine_name: field_images) ullimited value.



I'll migrate data to this content. Create migration group galary with file name migrate_plus.migration_group.galary.yml and content

id: galary
label: Import galary images
description: Import field images has multilple values.


Create migration file_images with file name migrate_plus.migration.file_images.yml

id: file_images
label: 'Migrate images files'
migration_group: galary
source:
  constants:
    file_destination: 'public://galary/'
  plugin: embedded_data
  data_rows:
    -
      fid: 1
      alt: 'Bootstrap'
      src: 'https://www.drupal.org/files/styles/grid-3/public/project-images/bootstrap_project_1.png'
      filename: 'bootstrap_project_1.png'
    -
      fid: 2
      alt: 'Adminimal - Responsive Administration Theme'
      src: 'https://www.drupal.org/files/adminimal-logo-slogan.png'
      filename: 'adminimal-logo-slogan.png'
    -
      fid: 3
      alt: 'AdaptiveTheme'
      src: 'https://www.drupal.org/files/styles/grid-3/public/project-images/Adaptivethemes_220.png'
      filename: 'Adaptivethemes_220.png'
    -
      fid: 4
      alt: 'Drupal8 Zymphonies Theme'
      src: 'https://www.drupal.org/files/styles/grid-3/public/project-images/desktop_8.png'
      filename: 'desktop_8.png'
  ids:
    fid:
      type: integer
process:
  public_path:
    -
      plugin: concat
      delimiter: ''
      source:
        - constants/file_destination
        - filename
    -
      plugin: urlencode
  uri:
    plugin: file_copy
    source:
      - src
      - '@public_path'
destination:
  plugin: entity:file


Create migration node_images with file name migrate_plus.migration.node_images.yml and content

id: node_images
label: Node galaryy
migration_group: galary
source:
  plugin: embedded_data
  data_rows:
    -
      nid: 1
      title: 'Bootstrap'
      body: 'Body Bootstrap'
      images: 1|3
    -
      nid: 2
      title: 'Adminimal - Responsive Administration Theme'
      body: 'Body Adminimal - Responsive Administration Theme'
      images: 2|4
  ids:
    nid:
      type: integer
destination:
  plugin: entity:node
  default_bundle: galary
process:
  title: title
  'body/0/value': body
  'body/0/format':
    plugin: default_value
    default_value: basic_html
  field_images:
    plugin: sub_process
    source: images
    process:
      target_id:
        plugin: migration_lookup
        migration: file_images
        source: fid
migration_dependencies:
  required:
    - file_images


In my case, two source file_images and node_images I use the embedded_data source plugin for the sake of simplicity so that this example can be copy-pasted as a working example.

Let see images: 2|4 or images: 1|3 in data_rows.
I'll use source: images for process sub_process plugin but data is not like data example. So I need use hook_migrate_prepare_row or method prepareRow in your source plugin to prepare soure.

/**
 * Implements hook_migrate_MIGRATION_ID_prepare_row().
 */
function MODULE_NAME_migrate_node_images_prepare_row(Row $row, MigrateSourceInterface $source, MigrationInterface $migration) {
  $images = $row-&gt;getSourceProperty('images');
  $images = explode('|', $images);
  $data = [];
  foreach ($images as $index =&gt; $fid) {
    $data[$index] = ['fid' =&gt; $fid];
  }
  $row-&gt;setSourceProperty('images', $data);
}


Now, you can import data to this content have multiple field images with 

drush mim file_images &amp;&amp; drush mim node_images