Why can't I make this insert statement a procedure?
I've raised a bug for this. In the meantime, you can work around the issue by using dynamic SQL:
create or replace directory tmp as '/tmp';
declare
  f utl_file.file_type;
begin
  f := utl_file.fopen ('TMP', 'test.csv', 'w');
  utl_file.put_line(f, '1,1');
  utl_file.put_line(f, '2,2');
  utl_file.fclose(f);
end;
/

create table t (
  c1 int, c2 int
);

create or replace procedure p as
begin
  execute immediate q'!insert into t 
    select * from external (
    ( c1 int, c2 int )
    default directory tmp
    location ( 'test.csv' )
  )!';
end p;
/

exec p();

select * from t;

C1     C2   
    1     1 
    2     2