I did some experiments on my own and found: No is not a bug, it is a misunderstanding. The parameter "WithHeaders" refers to the datafile, not to the grid; it means "there is a header line in the file which is to be included in the grid, or not". Since you want to load all data lines "WithHeaders" must definitely be true.
As you notice you are overwriting your prepared headers this way. So after you imported the file you only have to insert a row before the very first grid row to become the new fixedrow. The grid has a handly method for this: InsertRowWithValues
StringGrid1.LoadFromCSVFile('data.txt', ';', true);
StringGrid1.InsertRowWithValues(0, ['', 'Title 1', Title 2']);
And of course: don't prepare the fixedRow before the import since it will be overwritten.