We are using a similar process in our TFS Build, I am pretty sure this handles successfully newly inserted elements (tables, columns, SPs, indices etc).
At first we generate the .dbschema of the old DB by invoking VSDBCMD with a:
/a:import /dsp:sql /model:C:\PATH\old.dbschema /cs:"Server=SQLSERVER;Integrated Security=False;Pooling=False;Initial Catalog=OLDDB;User=username;Password=password;
Then we we generate the .dbschema of the newest state of the DB, which at an earlier step has been deployed (via MSBuild):
/a:import /dsp:sql /model:C:\PATH\new.dbschema /cs:"Server=SQLSERVER;Integrated Security=False;Pooling=False;Initial Catalog=NEWDB;User=username;Password=password;
We finally invoke VSDBCMD for a third time, so that it generates the ALTER:
/a:deploy /dsp:sql /model:C:\PATH\new.dbschema /targetmodelfile:C:\PATH\old.dbschema /DeploymentScriptFile:C:\PATH\DB_Alter.sql /p:Targetdatabase="DB"
This generated DB_Alter.sql can be applied on the production-SQL running the previous state of the DB, in order to shape it into the latest.
What you are implying could either be traced back to you not forming the VSDBCMD arguments correctly, or a direct bug of the tool. In your place, I would manually experiment with the tool in order to ensure which of the two applies.
To my best knowledge, the above presented procedure works OK, so I tend to believe there is something wrong with your implementation.