This one has a straight forward answer.
perimeterLength = regionprops(blob, 'Perimeter');
will always return a structure as the contents of perimeterLength. You can check this out yourself by just inspecting the contents of perimeterLength before you assign it, and notice that the value you're looking for is actually stored in:
So I'll bet that changing your code to:
BLOB_STATS(i,3) = perimeterLength.Perimeter;
will make things work again (except for one particular case I'll describe below).
The reason why the line
BLOB_STATS(i,3) = perimeterLength;
worked fine was that you would have to have called this before you filled BLOB_STATS with any numeric contents. Structure arrays exist, so it's perfectly legal to insert a structure into, say, the 5th element of a variable that doesn't exist:
newVar(5) = struct('Perimeter', 1234)
But it's not ok to try to put the same thing into an already-defined matrix:
newVar = ones(10,1);
newVar(5) = struct('Perimeter',1234)
Now, back with your loop... just be careful of what could happen if your blob variable is all zeros. In that situation, regionprops will return an empty structure, so the contents of the 'Perimeter' field will be empty. It's not legal to run the following bit of code, so just be careful to ensure there will always be something for regionprops to return:
newVar = ones(4,3)
newVar(2,2) = 
Did this clear things up for you?