I developed my idea above into a small helper function that others might find useful.
proc iml;
/* The TRI_IDX function returns the index numbers of the triangular elements in a
square matrix of side n.
The parameter UPPER is a Boolean that gives the upper triangle when true,
the lower triangle when false.
The parameter MAINDIAG is a Boolean that indicates whether or not the
elements from the main diagonal should be included.
*/
start tri_idx(n, upper, maindiag);
idx = cusum( vech( diag((1-maindiag):(n-1)) + 1));
if upper then return(idx); else return((n#n+1) - idx[nrow(idx):1] );
finish;
/* demonstrate function for a 4x4 matrix */
print (shape(1:16,4)) [format=2.0];
print (tri_idx(4,0,0)) [l='lower triangle no diagonal'];
print (tri_idx(4,0,1)) [l='lower triangle including diagonal'];
print (tri_idx(4,1,0)) [l='upper triangle no diagonal'];
print (tri_idx(4,1,1)) [l='upper triangle including diagonal'];
quit;