Looks like a compiler defect - when changing this declaration:
TOnMyIntfItemSelected<T: IMyIntfItem> = procedure(AItem: IMyIntfItem) of object;
the code for TMyIntfItemA<T>.Select looks like this:
List.Intf.pas.82: begin
007083E4 53 push ebx
List.Intf.pas.83: if Assigned(FOnItemSelected) then
007083E5 6683781200 cmp word ptr [eax+$12],$00
007083EA 7411 jz $007083fd
List.Intf.pas.84: FOnItemSelected(Self);
007083EC 8BD0 mov edx,eax
007083EE 85D2 test edx,edx
007083F0 7403 jz $007083f5
007083F2 83EAE8 sub edx,-$18 // this is where it turns Self into an IMyIntfItem, $18 is the offset where the interface method table pointer sits inside the object
007083F5 8BD8 mov ebx,eax
007083F7 8B4314 mov eax,[ebx+$14]
007083FA FF5310 call dword ptr [ebx+$10]
List.Intf.pas.85: end;
007083FD 5B pop ebx
007083FE C3 ret
but when it has the generic T parameter it looks like this:
List.Intf.pas.82: begin
007083E4 53 push ebx
List.Intf.pas.83: if Assigned(FOnItemSelected) then
007083E5 6683781200 cmp word ptr [eax+$12],$00
007083EA 740A jz $007083f6
List.Intf.pas.84: FOnItemSelected(Self);
007083EC 8BD8 mov ebx,eax
007083EE 8BD0 mov edx,eax // here it simply passes Self
007083F0 8B4314 mov eax,[ebx+$14]
007083F3 FF5310 call dword ptr [ebx+$10]
List.Intf.pas.85: end;
007083F6 5B pop ebx
007083F7 C3 ret
To explain this a bit more: when putting an interface type as generic type constraint this means for the compiler that the type you put for the generic type argument not only has to be that interface type but also that it can be a class that implements this interface. TMyIntfItemA<T> does this and thus satisfies the compiler when passing it to the argument of that event handler. However, inside the event handler, it is being treated as an interface and due to the lacking const parameter the compiler inserted an IntfAddRef call which blows up as the parameter that was passed was not really an interface reference but an object reference. Putting the const parameter makes it blow up a bit later though, namely when accessing Caption.