I have done a quick check and found that you can relate a file with emailMessage via apex. But hasAttachment does not become true. I have used contentversion's firstpublicationId field to relate the file with EmailMessage record.
EmailMessage emailMessage = new EmailMessage();
emailMessage.status = '3'; // email was sent
emailMessage.relatedToId = '5000o00002OhKjg';
emailMessage.fromAddress = '[email protected]'; // from address
emailMessage.fromName = 'Billing Department'; // from name
emailMessage.toAddress = '[email protected]';
emailMessage.Subject = 'Hello';
emailMessage.HtmlBody = 'Hello World';
insert emailMessage;
ContentVersion ContVerFile = new ContentVersion();
ContVerFile.VersionData = Blob.valueOf('string');
ContVerFile.Title = 'title';
ContVerFile.ContentLocation= 's';
ContVerFile.PathOnClient='title.csv';
ContVerFile.FirstPublishLocationId = emailMessage.id;
insert ContVerFile;
system.debug(ContVerFile.id);
System.debug([SELECT Id,HasAttachment FROM EmailMessage WHERE Id =: emailMessage.Id]);

According to docs, hasAttachment Indicates whether the email was sent
with an attachment (true) or not (false).