You can use the month and year functions, along with findgroups, to group the timetable by year and month. Then splitapply to perform some function (e.g., your method to "calculate the global minimum variance portfolio") on each month's data.
% construct a timetable like yours, containing (random)
% daily returns of 8 assets over 5208 days:
n_days = 5208;
n_assets = 8;
temp = num2cell(randn(n_days,n_assets),1);
t = timetable(datetime(now()-(n_days-1:-1:0).', ...
'ConvertFrom','datenum','Format','dd-MMM-yyyy'),temp{:})
% group returns by year and month
mm = month(t.Time);
yy = year(t.Time);
g = findgroups(yy,mm);
% apply a function on each group (i.e., each month+year)
% the function get_max_return() here calculates the maximum
% value amongst all the returns of that group
tC = splitapply(@(varargin)get_max_return(varargin{:}),t,g)
function out = get_max_return(varargin)
out = max([varargin{:}],[],'all');
end
