Just an update on this. It turns out it's not an OLE Automation compatibility issue between Delphi and LibreOffice as I was starting to fear. Apparently the inner array that you pass to the initialize method of SequenceInputStream must be a "strongly typed uno value", so you have to massage the input a little bit.
For the benefit of anyone stumbling upon this thread in future, here is how you load a LibreOffice document from a memory buffer:
function LoadLibreOfficeDocumentFromMemory(const ADocumentFileData: TBytes): Variant;
var
LServiceManager, LStrictlyTypedUnoValue, LInputStream, LDesktop: Variant;
LArgumentsArray, LPropertyArray: TArray<Variant>;
begin
LServiceManager := CreateOleObject('com.sun.star.ServiceManager');
{A SequenceInputStream is used to load the document from memory. In order to get the bytes into the
SequenceInputStream the initialize method is called. This method takes an array of arguments, in which it
expects to find a single entry which must be a strictly typed uno value - a byte array.}
{Create the argument array for SequenceInputStream.initialize}
LStrictlyTypedUnoValue := LServiceManager.Bridge_GetValueObject;
LStrictlyTypedUnoValue.Set('[]byte', Variant(ADocumentFileData));
SetLength(LArgumentsArray, 1);
LArgumentsArray[0] := LStrictlyTypedUnoValue;
{Create and initialize the SequenceInputStream}
LInputStream := LServiceManager.createInstance('com.sun.star.io.SequenceInputStream');
LInputStream.initialize(Variant(LArgumentsArray));
{Specify the stream to load from in the property array for loadComponentFromURL.}
SetLength(LPropertyArray, 1);
LPropertyArray[0] := LServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
LPropertyArray[0].Name := 'InputStream';
LPropertyArray[0].Value := LInputStream;
{Load and display the document}
LDesktop := LServiceManager.createInstance('com.sun.star.frame.Desktop');
Result := LDesktop.loadComponentFromURL('private:stream', '_blank', 0, Variant(LPropertyArray));
end;