Сборщик будет отдавать память, когда у программы будет простой и/или системе она(память) потребуется и/или в системе будет доступно менее некоторого % памяти.
По графику вызова GC, он вызывался только в самом начале.
Если хотите другого поведения - вынесите выделение и использование массива в функцию, и крутите в цикле функцию, при этом поставьте у gc параллельную серверную сборку. Тогда выброшенные фреймы стека с указателем на ваш старый byte[] должны быстро подбираться параллельной сборкой мусора, приложение начнет интенсивнее отдавать память.
Соответствующие флаги в appConfig-е
https://msdn.microsoft.com/ru-ru/library/ms229357(...
https://msdn.microsoft.com/ru-ru/library/ms229357(...