I have a matrix:
A = [1 1 1
     2 2 2
     3 3 3]
Is there a vectorized way of obtaining:
B = [1 0 0 
     0 1 0
     0 0          
        
Here's another way using sparse and repmat:
A = [1 2 3; 4 5 6; 7 8 9];
A = A.';
B = full(sparse(1:numel(A), repmat(1:size(A,1),1,size(A,2)), A(:)));
The original matrix is in A, and I transpose it so I can unroll the rows of each matrix properly for the next step.  I use sparse to declare what is non-zero in a matrix.  Specifically, we see that there is only one entry per row and so the row indices should range from 1 up to as many entries as there are in A.  The columns fluctuate from 1 up to the last column and repeat.  mod is certainly the way to go via thewaywewalk's solution, but I wanted to use repmat so that this is an independent solution from his approach.  As such, we create a vector for accessing the columns that goes from 1 up to as many columns as we have, and we repeat this for as many rows as we have.  These row and column index vectors are is going to dictate where the non-zero locations will appear.  Finally, what will go into each non-zero location are the elements of A unrolled in row major order, following the order dictated by the row and column index vectors.  
Take note that in the repmat call, the rows and columns when calling size are reversed due to the transpose operation. 
The result thus follows and we get:
>> B
B =
     1     0     0
     0     2     0
     0     0     3
     4     0     0
     0     5     0
     0     0     6
     7     0     0
     0     8     0
     0     0     9
Given the sparsity of the above problem, it may be faster to leave the matrix in sparse form and only convert using full if necessary.  There will be time spent to convert between the two formats so take that into consideration if you decide to benchmark.